精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

手寫線程池 - C 語言版

開發 后端
在各個編程語言的語種中都有線程池的概念,并且很多語言中直接提供了線程池,作為程序猿直接使用就可以了,下面給大家介紹一下線程池的實現原理。

[[442559]]

1. 線程池原理

我們使用線程的時候就去創建一個線程,這樣實現起來非常簡便,但是就會有一個問題:如果并發的線程數量很多,并且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。

那么有沒有一種辦法使得線程可以復用,就是執行完一個任務,并不被銷毀,而是可以繼續執行其他的任務呢?

線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,并處于多線程單元中。

如果某個線程在托管代碼中空閑(如正在等待某個事件), 則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。

在各個編程語言的語種中都有線程池的概念,并且很多語言中直接提供了線程池,作為程序猿直接使用就可以了,下面給大家介紹一下線程池的實現原理:

線程池的組成主要分為 3 個部分,這三部分配合工作就可以得到一個完整的線程池:

1).任務隊列,存儲需要處理的任務,由工作的線程來處理這些任務

  • 通過線程池提供的 API 函數,將一個待處理的任務添加到任務隊列,或者從任務隊列中刪除
  • 已處理的任務會被從任務隊列中刪除
  • 線程池的使用者,也就是調用線程池函數往任務隊列中添加任務的線程就是生產者線程

2).工作的線程(任務隊列任務的消費者) ,N個

  • 線程池中維護了一定數量的工作線程,他們的作用是是不停的讀任務隊列,從里邊取出任務并處理
  • 工作的線程相當于是任務隊列的消費者角色,
  • 如果任務隊列為空,工作的線程將會被阻塞 (使用條件變量 / 信號量阻塞)
  • 如果阻塞之后有了新的任務,由生產者將阻塞解除,工作線程開始工作

3).管理者線程(不處理任務隊列中的任務),1個

  • 它的任務是周期性的對任務隊列中的任務數量以及處于忙狀態的工作線程個數進行檢測
  • 當任務過多的時候,可以適當的創建一些新的工作線程
  • 當任務過少的時候,可以適當的銷毀一些工作的線程

 

 

 

 

2. 任務隊列

 

  1. // 任務結構體 
  2. typedef struct Task 
  3.     void (*function)(void* arg); 
  4.     void* arg; 
  5. }Task; 

3. 線程池定義

 

  1. // 線程池結構體 
  2. struct ThreadPool 
  3.     // 任務隊列 
  4.     Task* taskQ; 
  5.     int queueCapacity;  // 容量 
  6.     int queueSize;      // 當前任務個數 
  7.     int queueFront;     // 隊頭 -> 取數據 
  8.     int queueRear;      // 隊尾 -> 放數據 
  9.  
  10.     pthread_t managerID;    // 管理者線程ID 
  11.     pthread_t *threadIDs;   // 工作的線程ID 
  12.     int minNum;             // 最小線程數量 
  13.     int maxNum;             // 最大線程數量 
  14.     int busyNum;            // 忙的線程的個數 
  15.     int liveNum;            // 存活的線程的個數 
  16.     int exitNum;            // 要銷毀的線程個數 
  17.     pthread_mutex_t mutexPool;  // 鎖整個的線程池 
  18.     pthread_mutex_t mutexBusy;  // 鎖busyNum變量 
  19.     pthread_cond_t notFull;     // 任務隊列是不是滿了 
  20.     pthread_cond_t notEmpty;    // 任務隊列是不是空了 
  21.  
  22.     int shutdown;           // 是不是要銷毀線程池, 銷毀為1, 不銷毀為0 
  23. }; 

4. 頭文件聲明

 

  1. #ifndef _THREADPOOL_H 
  2. #define _THREADPOOL_H 
  3.  
  4. typedef struct ThreadPool ThreadPool; 
  5. // 創建線程池并初始化 
  6. ThreadPool *threadPoolCreate(int minint maxint queueSize); 
  7.  
  8. // 銷毀線程池 
  9. int threadPoolDestroy(ThreadPool* pool); 
  10.  
  11. // 給線程池添加任務 
  12. void threadPoolAdd(ThreadPool* pool, void(*func)(void*), void* arg); 
  13.  
  14. // 獲取線程池中工作的線程的個數 
  15. int threadPoolBusyNum(ThreadPool* pool); 
  16.  
  17. // 獲取線程池中活著的線程的個數 
  18. int threadPoolAliveNum(ThreadPool* pool); 
  19.  
  20. ////////////////////// 
  21. // 工作的線程(消費者線程)任務函數 
  22. void* worker(void* arg); 
  23. // 管理者線程任務函數 
  24. void* manager(void* arg); 
  25. // 單個線程退出 
  26. void threadExit(ThreadPool* pool); 
  27. #endif  // _THREADPOOL_H 

5. 源文件定義

 

  1. ThreadPool* threadPoolCreate(int minint maxint queueSize) 
  2.     ThreadPool* pool = (ThreadPool*)malloc(sizeof(ThreadPool)); 
  3.     do  
  4.     { 
  5.         if (pool == NULL
  6.         { 
  7.             printf("malloc threadpool fail...\n"); 
  8.             break; 
  9.         } 
  10.  
  11.         pool->threadIDs = (pthread_t*)malloc(sizeof(pthread_t) * max); 
  12.         if (pool->threadIDs == NULL
  13.         { 
  14.             printf("malloc threadIDs fail...\n"); 
  15.             break; 
  16.         } 
  17.         memset(pool->threadIDs, 0, sizeof(pthread_t) * max); 
  18.         pool->minNum = min
  19.         pool->maxNum = max
  20.         pool->busyNum = 0; 
  21.         pool->liveNum = min;    // 和最小個數相等 
  22.         pool->exitNum = 0; 
  23.  
  24.         if (pthread_mutex_init(&pool->mutexPool, NULL) != 0 || 
  25.             pthread_mutex_init(&pool->mutexBusy, NULL) != 0 || 
  26.             pthread_cond_init(&pool->notEmpty, NULL) != 0 || 
  27.             pthread_cond_init(&pool->notFull, NULL) != 0) 
  28.         { 
  29.             printf("mutex or condition init fail...\n"); 
  30.             break; 
  31.         } 
  32.  
  33.         // 任務隊列 
  34.         pool->taskQ = (Task*)malloc(sizeof(Task) * queueSize); 
  35.         pool->queueCapacity = queueSize; 
  36.         pool->queueSize = 0; 
  37.         pool->queueFront = 0; 
  38.         pool->queueRear = 0; 
  39.  
  40.         pool->shutdown = 0; 
  41.  
  42.         // 創建線程 
  43.         pthread_create(&pool->managerID, NULL, manager, pool); 
  44.         for (int i = 0; i < min; ++i) 
  45.         { 
  46.             pthread_create(&pool->threadIDs[i], NULL, worker, pool); 
  47.         } 
  48.         return pool; 
  49.     } while (0); 
  50.  
  51.     // 釋放資源 
  52.     if (pool && pool->threadIDs) free(pool->threadIDs); 
  53.     if (pool && pool->taskQ) free(pool->taskQ); 
  54.     if (pool) free(pool); 
  55.  
  56.     return NULL
  57.  
  58. int threadPoolDestroy(ThreadPool* pool) 
  59.     if (pool == NULL
  60.     { 
  61.         return -1; 
  62.     } 
  63.  
  64.     // 關閉線程池 
  65.     pool->shutdown = 1; 
  66.     // 阻塞回收管理者線程 
  67.     pthread_join(pool->managerID, NULL); 
  68.     // 喚醒阻塞的消費者線程 
  69.     for (int i = 0; i < pool->liveNum; ++i) 
  70.     { 
  71.         pthread_cond_signal(&pool->notEmpty); 
  72.     } 
  73.     // 釋放堆內存 
  74.     if (pool->taskQ) 
  75.     { 
  76.         free(pool->taskQ); 
  77.     } 
  78.     if (pool->threadIDs) 
  79.     { 
  80.         free(pool->threadIDs); 
  81.     } 
  82.  
  83.     pthread_mutex_destroy(&pool->mutexPool); 
  84.     pthread_mutex_destroy(&pool->mutexBusy); 
  85.     pthread_cond_destroy(&pool->notEmpty); 
  86.     pthread_cond_destroy(&pool->notFull); 
  87.  
  88.     free(pool); 
  89.     pool = NULL
  90.  
  91.     return 0; 
  92.  
  93.  
  94. void threadPoolAdd(ThreadPool* pool, void(*func)(void*), void* arg) 
  95.     pthread_mutex_lock(&pool->mutexPool); 
  96.     while (pool->queueSize == pool->queueCapacity && !pool->shutdown) 
  97.     { 
  98.         // 阻塞生產者線程 
  99.         pthread_cond_wait(&pool->notFull, &pool->mutexPool); 
  100.     } 
  101.     if (pool->shutdown) 
  102.     { 
  103.         pthread_mutex_unlock(&pool->mutexPool); 
  104.         return
  105.     } 
  106.     // 添加任務 
  107.     pool->taskQ[pool->queueRear].function = func; 
  108.     pool->taskQ[pool->queueRear].arg = arg; 
  109.     pool->queueRear = (pool->queueRear + 1) % pool->queueCapacity; 
  110.     pool->queueSize++; 
  111.  
  112.     pthread_cond_signal(&pool->notEmpty); 
  113.     pthread_mutex_unlock(&pool->mutexPool); 
  114.  
  115. int threadPoolBusyNum(ThreadPool* pool) 
  116.     pthread_mutex_lock(&pool->mutexBusy); 
  117.     int busyNum = pool->busyNum; 
  118.     pthread_mutex_unlock(&pool->mutexBusy); 
  119.     return busyNum; 
  120.  
  121. int threadPoolAliveNum(ThreadPool* pool) 
  122.     pthread_mutex_lock(&pool->mutexPool); 
  123.     int aliveNum = pool->liveNum; 
  124.     pthread_mutex_unlock(&pool->mutexPool); 
  125.     return aliveNum; 
  126.  
  127. void* worker(void* arg) 
  128.     ThreadPool* pool = (ThreadPool*)arg; 
  129.  
  130.     while (1) 
  131.     { 
  132.         pthread_mutex_lock(&pool->mutexPool); 
  133.         // 當前任務隊列是否為空 
  134.         while (pool->queueSize == 0 && !pool->shutdown) 
  135.         { 
  136.             // 阻塞工作線程 
  137.             pthread_cond_wait(&pool->notEmpty, &pool->mutexPool); 
  138.  
  139.             // 判斷是不是要銷毀線程 
  140.             if (pool->exitNum > 0) 
  141.             { 
  142.                 pool->exitNum--; 
  143.                 if (pool->liveNum > pool->minNum) 
  144.                 { 
  145.                     pool->liveNum--; 
  146.                     pthread_mutex_unlock(&pool->mutexPool); 
  147.                     threadExit(pool); 
  148.                 } 
  149.             } 
  150.         } 
  151.  
  152.         // 判斷線程池是否被關閉了 
  153.         if (pool->shutdown) 
  154.         { 
  155.             pthread_mutex_unlock(&pool->mutexPool); 
  156.             threadExit(pool); 
  157.         } 
  158.  
  159.         // 從任務隊列中取出一個任務 
  160.         Task task; 
  161.         task.function = pool->taskQ[pool->queueFront].function
  162.         task.arg = pool->taskQ[pool->queueFront].arg; 
  163.         // 移動頭結點 
  164.         pool->queueFront = (pool->queueFront + 1) % pool->queueCapacity; 
  165.         pool->queueSize--; 
  166.         // 解鎖 
  167.         pthread_cond_signal(&pool->notFull); 
  168.         pthread_mutex_unlock(&pool->mutexPool); 
  169.  
  170.         printf("thread %ld start working...\n", pthread_self()); 
  171.         pthread_mutex_lock(&pool->mutexBusy); 
  172.         pool->busyNum++; 
  173.         pthread_mutex_unlock(&pool->mutexBusy); 
  174.         task.function(task.arg); 
  175.         free(task.arg); 
  176.         task.arg = NULL
  177.  
  178.         printf("thread %ld end working...\n", pthread_self()); 
  179.         pthread_mutex_lock(&pool->mutexBusy); 
  180.         pool->busyNum--; 
  181.         pthread_mutex_unlock(&pool->mutexBusy); 
  182.     } 
  183.     return NULL
  184.  
  185. void* manager(void* arg) 
  186.     ThreadPool* pool = (ThreadPool*)arg; 
  187.     while (!pool->shutdown) 
  188.     { 
  189.         // 每隔3s檢測一次 
  190.         sleep(3); 
  191.  
  192.         // 取出線程池中任務的數量和當前線程的數量 
  193.         pthread_mutex_lock(&pool->mutexPool); 
  194.         int queueSize = pool->queueSize; 
  195.         int liveNum = pool->liveNum; 
  196.         pthread_mutex_unlock(&pool->mutexPool); 
  197.  
  198.         // 取出忙的線程的數量 
  199.         pthread_mutex_lock(&pool->mutexBusy); 
  200.         int busyNum = pool->busyNum; 
  201.         pthread_mutex_unlock(&pool->mutexBusy); 
  202.  
  203.         // 添加線程 
  204.         // 任務的個數>存活的線程個數 && 存活的線程數<最大線程數 
  205.         if (queueSize > liveNum && liveNum < pool->maxNum) 
  206.         { 
  207.             pthread_mutex_lock(&pool->mutexPool); 
  208.             int counter = 0; 
  209.             for (int i = 0; i < pool->maxNum && counter < NUMBER 
  210.                 && pool->liveNum < pool->maxNum; ++i) 
  211.             { 
  212.                 if (pool->threadIDs[i] == 0) 
  213.                 { 
  214.                     pthread_create(&pool->threadIDs[i], NULL, worker, pool); 
  215.                     counter++; 
  216.                     pool->liveNum++; 
  217.                 } 
  218.             } 
  219.             pthread_mutex_unlock(&pool->mutexPool); 
  220.         } 
  221.         // 銷毀線程 
  222.         // 忙的線程*2 < 存活的線程數 && 存活的線程>最小線程數 
  223.         if (busyNum * 2 < liveNum && liveNum > pool->minNum) 
  224.         { 
  225.             pthread_mutex_lock(&pool->mutexPool); 
  226.             pool->exitNum = NUMBER; 
  227.             pthread_mutex_unlock(&pool->mutexPool); 
  228.             // 讓工作的線程自殺 
  229.             for (int i = 0; i < NUMBER; ++i) 
  230.             { 
  231.                 pthread_cond_signal(&pool->notEmpty); 
  232.             } 
  233.         } 
  234.     } 
  235.     return NULL
  236.  
  237. void threadExit(ThreadPool* pool) 
  238.     pthread_t tid = pthread_self(); 
  239.     for (int i = 0; i < pool->maxNum; ++i) 
  240.     { 
  241.         if (pool->threadIDs[i] == tid) 
  242.         { 
  243.             pool->threadIDs[i] = 0; 
  244.             printf("threadExit() called, %ld exiting...\n", tid); 
  245.             break; 
  246.         } 
  247.     } 
  248.     pthread_exit(NULL); 

6. 測試代碼

 

  1. void taskFunc(void* arg) 
  2.     int num = *(int*)arg; 
  3.     printf("thread %ld is working, number = %d\n"
  4.         pthread_self(), num); 
  5.     sleep(1); 
  6.  
  7. int main() 
  8.     // 創建線程池 
  9.     ThreadPool* pool = threadPoolCreate(3, 10, 100); 
  10.     for (int i = 0; i < 100; ++i) 
  11.     { 
  12.         int* num = (int*)malloc(sizeof(int)); 
  13.         *num = i + 100; 
  14.         threadPoolAdd(pool, taskFunc, num); 
  15.     } 
  16.  
  17.     sleep(30); 
  18.  
  19.     threadPoolDestroy(pool); 
  20.     return 0; 

 

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2013-06-03 09:34:14

崩潰程序程序算法

2020-12-10 08:24:40

線程池線程方法

2020-03-05 15:34:16

線程池C語言局域網

2022-03-09 09:43:01

工具類線程項目

2009-05-29 09:48:05

Sandboxie瀏覽器

2011-10-21 15:33:45

Dart

2025-06-23 00:00:02

線程池Java任務隊列

2021-02-01 08:28:24

Linux線程池Linux系統

2024-05-21 11:09:17

2011-01-05 11:12:34

C++

2009-08-04 17:18:02

C#線程

2021-11-11 15:12:21

C語言線程代碼

2013-06-24 15:58:19

Windows 8.1Windows 8.1

2024-12-27 09:08:25

2023-05-19 08:01:24

Key消費場景

2018-09-25 14:35:06

zl

2021-04-08 11:10:07

C語言版本Cmake

2013-04-09 12:18:45

socket.ioC服務器

2024-07-15 08:20:24

2022-09-06 08:31:09

線程池工具系統
點贊
收藏

51CTO技術棧公眾號

日韩黄色精品视频| 国产视频精品视频| 黄色在线播放网站| 国产伦理精品不卡| 78m国产成人精品视频| 久久丫精品国产亚洲av不卡| 国产精品99精品一区二区三区∴| 亚洲另类中文字| 精品伦精品一区二区三区视频| 波多野结衣在线观看一区| 亚洲深深色噜噜狠狠爱网站| 日韩电影第一页| 男女污污视频网站| 成人爽a毛片免费啪啪| 成人欧美一区二区三区黑人麻豆 | 日韩av电影网| 色综合色综合| 亚洲欧美在线播放| 在线免费黄色小视频| 欧美日韩精品免费观看视完整| 亚洲精品成人少妇| 图片区小说区区亚洲五月| 亚洲欧美激情另类| 久久91精品久久久久久秒播| 2018国产精品视频| 免费网站看av| 亚洲一区 二区 三区| 亚洲性生活视频| 国产伦精品一区二区三区精品| 欧美综合社区国产| 色综合久久中文综合久久牛| 久久综合久久网| 亚洲精品一区中文| 国产69视频在线观看| 欧美系列精品| 欧美色综合网站| 18岁视频在线观看| 9i看片成人免费高清| 亚洲影院在线观看| 可以免费看的黄色网址| av午夜在线| 国产亚洲欧美激情| 欧洲一区二区日韩在线视频观看免费 | 91精品国产福利| 一级黄色片国产| 免费视频观看成人| 欧美亚洲日本一区| 日本免费观看网站| 欧美暴力调教| 91久久久免费一区二区| 国产精品欧美激情在线观看| 欧美久久天堂| 欧美视频免费在线观看| 国产二级片在线观看| 国产传媒在线| 亚洲大型综合色站| 精品少妇人妻av免费久久洗澡| gogo久久| 精品久久久久久久久久久久久久| 国产精品无码人妻一区二区在线| 福利小视频在线| 黄网动漫久久久| 欧洲av无码放荡人妇网站| 欧美www.| 欧美蜜桃一区二区三区| 五月六月丁香婷婷| 一区二区网站| 日韩国产激情在线| 一区二区三区在线观看免费视频| 欧美中文字幕一区二区| 久久精品国产91精品亚洲| caoporn91| 亚洲国产裸拍裸体视频在线观看乱了中文 | 鲁丝一区鲁丝二区鲁丝三区| 免费一级在线观看| 中文字幕av不卡| 欧美xxxx吸乳| 国模精品视频| 欧美日韩中文字幕一区| 午夜天堂在线视频| 国产精品xxx在线观看| 亚洲欧美日韩图片| 久草手机视频在线观看| 国产精品v欧美精品v日本精品动漫| 欧美精品videossex88| 西西44rtwww国产精品| 日本视频免费一区| 91久久伊人青青碰碰婷婷| 手机av免费在线观看| 国产色产综合产在线视频| 在线观看一区二区三区三州| 丝袜中文在线| 在线亚洲免费视频| 9191在线视频| 精品午夜久久| 久久久久久网址| 国产三级理论片| 成人黄色在线看| 亚洲午夜久久久影院伊人| 免费在线播放电影| 欧美伊人精品成人久久综合97| 丰满饥渴老女人hd| av影片在线一区| 久久久久久国产精品| 中文字幕制服诱惑| a级高清视频欧美日韩| 亚洲成人一区二区三区| av老司机在线观看| 欧美男男青年gay1069videost| 丰满岳乱妇一区二区| 91久久国产| 国产成人精品亚洲精品| 国产91久久久| 亚洲日本电影在线| 久久综合伊人77777麻豆最新章节| 日韩精品一区国产| 日日骚av一区| 五月婷婷激情视频| av在线不卡免费看| 一区二区视频国产| 日韩三区免费| 亚洲精品丝袜日韩| 国产午夜福利一区二区| 国产一区二区0| 亚洲国产成人不卡| 欧美日韩美女| 日韩乱码在线视频| 日本在线视频中文字幕| 国产成人综合在线播放| 自拍偷拍一区二区三区| 69堂精品视频在线播放| 亚洲国产又黄又爽女人高潮的| 日本黄色小说视频| 九色|91porny| 中文精品一区二区三区| 欧美va视频| 国产亚洲一级高清| 黄色片视频免费| 久久夜色精品一区| 国产日产欧美视频| 露出调教综合另类| 久久久亚洲国产| 黄色三级网站在线观看| 亚洲成精国产精品女| 大尺度在线观看| 黑丝一区二区三区| 国产精品国色综合久久| 暧暧视频在线免费观看| 精品国产不卡一区二区三区| 久久综合综合久久| 日韩精品诱惑一区?区三区| 亚洲一区在线观看免费 | 精品自拍偷拍视频| 激情图片小说一区| 爱爱爱视频网站| 国产精品亚洲欧美一级在线| 欧美成年人视频网站欧美| jizz中国女人| 夜色激情一区二区| 毛茸茸free性熟hd| 久久精品国产清高在天天线| 麻豆蜜桃91| 四虎成人在线| 日韩在线视频网站| 精品人妻久久久久一区二区三区| 亚洲另类春色国产| 成熟妇人a片免费看网站| 野花国产精品入口| 欧美乱偷一区二区三区在线| 成人自拍视频网| 久久精品国产电影| а√中文在线资源库| 午夜精品久久久久久久久久| 亚欧洲乱码视频| 久草这里只有精品视频| 国产激情片在线观看| 人人香蕉久久| 国产精品久久久久免费a∨大胸| 精品麻豆一区二区三区| 精品国产伦一区二区三区观看体验| 日韩免费在线视频观看| 国产日产欧美一区二区三区| 久久精品国产露脸对白| 亚洲激情一区| 亚洲国产欧洲综合997久久| 精品三级久久久| 欧美与欧洲交xxxx免费观看| 日本三级视频在线播放| 亚洲成人久久久| 日韩精选在线观看| 亚洲一区中文在线| 在线观看亚洲大片短视频| 国产经典欧美精品| 欧美日韩一区二区在线免费观看| 国产精品久久久久久影院8一贰佰| 国产午夜精品在线| 日韩黄色在线| 欧美专区福利在线| 污污片在线免费视频| 亚洲人午夜色婷婷| 六月婷婷综合网| 欧美区一区二区三区| 久久国产视频播放| 一区二区三区在线免费观看| 亚洲第一综合网| 成人福利视频网站| 欧洲美女亚洲激情| 麻豆成人在线| 日本阿v视频在线观看| 精品99久久| 精品国产免费人成电影在线观...| 亚洲伦理网站| 国产不卡在线观看| h片在线观看下载| 日韩在线视频观看正片免费网站| 欧美精品久久久久久久久久丰满| 日韩精品一区二区三区老鸭窝 | 黄在线观看免费网站ktv| 久久精品国产亚洲一区二区| 成人欧美一区| 国产婷婷97碰碰久久人人蜜臀| 性一交一乱一精一晶| 欧美精品久久久久久久久老牛影院| 亚洲成熟少妇视频在线观看| 亚洲www啪成人一区二区麻豆| www.av免费| 国产精品灌醉下药二区| 亚洲精品午夜视频| 91香蕉视频污在线| 国产精品一区二区人妻喷水| 国产成人综合亚洲网站| www,av在线| 国内不卡的二区三区中文字幕| 亚洲人辣妹窥探嘘嘘| 日本少妇一区二区| 无限资源日本好片| 青青草国产成人99久久| av丝袜天堂网| 三级在线观看一区二区| 激情婷婷综合网| 久久蜜桃精品| 久热免费在线观看| 六月天综合网| 日本成人黄色网| 日韩和欧美一区二区| 日日碰狠狠丁香久燥| 久久久人人人| 日韩一级片播放| 老司机精品视频导航| 五月激情五月婷婷| 激情综合网av| 俄罗斯女人裸体性做爰| 国产成人av福利| 蜜桃色一区二区三区| av激情综合网| 成人片黄网站色大片免费毛片| 久久久久99精品一区| 国产一级久久久久毛片精品| 欧美高清在线一区二区| 成人免费视频入口| 亚洲日本韩国一区| 久久久久久免费观看| 亚洲超碰精品一区二区| 久久99精品波多结衣一区| 一本色道久久综合精品竹菊| 成人黄色免费网| 欧美一级xxx| 亚洲av毛片成人精品| 亚洲网站视频福利| 黄色网在线播放| 韩国三级电影久久久久久| 成人免费看视频网站| 国产精品香蕉av| 美女久久精品| 蜜桃久久影院| 日韩免费特黄一二三区| 黑人巨茎大战欧美白妇| 国产日韩欧美一区| 激情五月亚洲色图| 国产精品综合二区| 亚洲色图14p| 国产精品福利电影一区二区三区四区| 天堂网avav| 欧美性xxxxx| 国产剧情久久久| 亚洲美女激情视频| 高潮毛片在线观看| 欧美一级淫片aaaaaaa视频| 精品美女一区| 精品欧美一区二区在线观看视频| 日韩激情一区| 久久成人免费观看| 极品少妇xxxx精品少妇| 极品粉嫩小仙女高潮喷水久久 | 日韩高清免费av| 欧美日韩另类一区| 天天射天天操天天干| 俺去了亚洲欧美日韩| 中国色在线日|韩| 91黄在线观看| 凹凸成人精品亚洲精品密奴| 国产精品三级一区二区| 日本vs亚洲vs韩国一区三区二区| av电影在线播放| 亚洲欧洲综合另类在线| 亚洲精品中文字幕乱码三区91| 日韩欧美自拍偷拍| 岛国最新视频免费在线观看| 久久久久亚洲精品| 91精品视频一区二区| 欧美一区二区三区四区在线观看地址 | 韩国一区二区三区视频| 日韩不卡av| 99国产精品视频免费观看一公开| 免费av不卡在线| 国产日韩欧美综合在线| 日本熟妇毛耸耸xxxxxx| 7777精品伊人久久久大香线蕉完整版| 免费资源在线观看| 午夜精品一区二区三区在线视频| 精品国产三区在线| 亚洲最新在线| 奇米影视在线99精品| 精品无码一区二区三区| 精品久久久久久久久久| 国产综合在线播放| 欧美精品亚州精品| 亚洲一区av| 中文字幕欧美日韩一区二区| 日本欧美在线看| 在线观看日本中文字幕| 欧美性xxxxxxx| 欧美孕妇孕交| 日本国产欧美一区二区三区| 红杏视频成人| 久色视频在线播放| 不卡的av在线播放| 国产精彩视频在线| 精品国产成人系列| 97天天综合网| 国产偷久久久精品专区| 99精品视频免费观看| 中文字幕一区二区三区乱码不卡| 一区二区三区日韩精品| 亚洲精品成人电影| 欧美高清videos高潮hd| 第一区第二区在线| 欧美一区二区中文字幕| 99久久综合国产精品| 亚洲国产精品午夜在线观看| 亚洲激情小视频| 人人草在线视频| 欧美久久在线| 奇米影视一区二区三区| 日韩一区二区三区四区视频| 欧美日韩高清在线| 成人在线观看亚洲| 成人区精品一区二区| 影音先锋久久| 欧美老熟妇乱大交xxxxx| 欧洲生活片亚洲生活在线观看| av网站在线播放| 999日本视频| 99国产精品久久久久久久| 日本乱子伦xxxx| 欧美日韩国产高清一区二区三区| 菠萝蜜视频国产在线播放| 国产伦精品一区| 日韩中文字幕亚洲一区二区va在线| 国产精品久久久视频| 日韩欧美在线观看一区二区三区| 日本高清成人vr专区| 久久99精品久久久久久三级 | 亚洲最大成人网色| 亚洲第一黄网| 娇妻被老王脔到高潮失禁视频| 欧美人xxxx| 国产免费拔擦拔擦8x高清在线人| 欧美三级网色| 国产一区二区三区四| 精品在线播放视频| 自拍偷拍亚洲在线| 99re91这里只有精品| 91av俱乐部| 亚洲免费大片在线观看| 亚洲 欧美 自拍偷拍| 国产狼人综合免费视频| 亚洲国产mv| 欧美黄色高清视频| 精品国产乱子伦一区| 欧美123区| 免费人成自慰网站| 国产欧美久久久精品影院| 午夜精品久久久久久久爽| 日本三级久久久| 亚洲二区精品| 在线观看美女av| 亚洲欧美日韩一区二区在线 | 精品亚洲成a人| 欧产日产国产69|