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

線程池原理詳解及如何用C語言實現線程池

網絡 通信技術
線程池是一種多線程處理形式,大多用于高并發服務器上,它能合理有效的利用高并發服務器上的線程資源;線程與進程用于處理各項分支子功能,我們通常的操作是:接收消息 ==> 消息分類 ==> 線程創建 ==> 傳遞消息到子線程 ==> 線程分離 ==> 在子線程中執行任務 ==> 任務結束退出。

 線程池是一種多線程處理形式,大多用于高并發服務器上,它能合理有效的利用高并發服務器上的線程資源;線程與進程用于處理各項分支子功能,我們通常的操作是:接收消息 ==> 消息分類 ==> 線程創建 ==> 傳遞消息到子線程 ==> 線程分離 ==> 在子線程中執行任務 ==> 任務結束退出;

[[317565]]

對大多數小型局域網的通信來說,上述方法足夠滿足需求;但當我們的通信范圍擴大到廣域網或大型局域網通信中時,我們將面臨大量消息頻繁請求服務器;在這種情況下,創建與銷毀線程都已經成為一種奢侈的開銷,特別對于嵌入式服務器來說更應保證內存資源的合理利用;

因此,線程池技術應運而生;線程池允許一個線程可以多次復用,且每次復用的線程內部的消息處理可以不相同,將創建與銷毀的開銷省去而不必來一個請求開一個線程;

結構講解:

線程池是一個抽象的概念,其內部由任務隊列,一堆線程,管理者線程組成;

線程池原理詳解及如何用C語言實現線程池

我們將以上圖為例,實現一個最基礎的線程池,接下來將分部分依次講解;講解順序為:1.線程池總體結構 2.線程數組 3.任務隊列 4.管理者線程 5.使用線程池接口的例子

一、線程池總體結構

這里講解線程池在邏輯上的結構體;看下方代碼,該結構體threadpool_t中包含線程池狀態信息,任務隊列信息以及多線程操作中的互斥鎖;在任務結構體中包含了一個可以放置多種不同任務函數的函數指針,一個傳入該任務函數的void*類型的參數;

注意:在使用時需要將你的消息分類處理函數裝入任務的(*function);然后放置到任務隊列并通知空閑線程;

線程池狀態信息:描述當前線程池的基本信息,如是否開啟、最小線程數、最大線程數、存活線程數、忙線程數、待銷毀線程數等… …

任務隊列信息:描述當前任務隊列基本信息,如最大任務數、隊列不為滿條件變量、隊列不為空條件變量等… …

多線程互斥鎖:保證在同一時間點上只有一個線程在任務隊列中取任務并修改任務隊列信息、修改線程池信息;

函數指針:在打包消息階段,將分類后的消息處理函數放在(*function);

void*類型參數:用于傳遞消息處理函數需要的信息;

  1. /*任務*/ 
  2. typedef struct { 
  3. void *(*function)(void *); 
  4. void *arg; 
  5. } threadpool_task_t; 
  6. /*線程池管理*/ 
  7. struct threadpool_t{ 
  8. pthread_mutex_t lock; /* 鎖住整個結構體 */ 
  9. pthread_mutex_t thread_counter; /* 用于使用忙線程數時的鎖 */ 
  10. pthread_cond_t queue_not_full; /* 條件變量,任務隊列不為滿 */ 
  11. pthread_cond_t queue_not_empty; /* 任務隊列不為空 */ 
  12. pthread_t *threads; /* 存放線程的tid,實際上就是管理了線 數組 */ 
  13. pthread_t admin_tid; /* 管理者線程tid */ 
  14. threadpool_task_t *task_queue; /* 任務隊列 */ 
  15. /*線程池信息*/ 
  16. int min_thr_num; /* 線程池中最小線程數 */ 
  17. int max_thr_num; /* 線程池中最大線程數 */ 
  18. int live_thr_num; /* 線程池中存活的線程數 */ 
  19. int busy_thr_num; /* 忙線程,正在工作的線程 */ 
  20. int wait_exit_thr_num; /* 需要銷毀的線程數 */ 
  21. /*任務隊列信息*/ 
  22. int queue_front; /* 隊頭 */ 
  23. int queue_rear; /* 隊尾 */ 
  24. int queue_size; 
  25. /* 存在的任務數 */ 
  26. int queue_max_size; /* 隊列能容納的最大任務數 */ 
  27. /*線程池狀態*/ 
  28. int shutdown; /* true為關閉 */ 
  29. }; 
  30. **/*創建線程池*/** 
  31. threadpool_t * 
  32. threadpool_create(int min_thr_num, int max_thr_num, int queue_max_size) 
  33. { /* 最小線程數 最大線程數 最大任務數*/ 
  34. int i; 
  35. threadpool_t *pool = NULL
  36. do 
  37. /* 線程池空間開辟 */ 
  38. if ((pool=(threadpool_t *)malloc(sizeof(threadpool_t))) == NULL
  39. printf("malloc threadpool false; \n"); 
  40. break; 
  41. /*信息初始化*/ 
  42. pool->min_thr_num = min_thr_num; 
  43. pool->max_thr_num = max_thr_num; 
  44. pool->busy_thr_num = 0; 
  45. pool->live_thr_num = min_thr_num; 
  46. pool->wait_exit_thr_num = 0; 
  47. pool->queue_front = 0; 
  48. pool->queue_rear = 0; 
  49. pool->queue_size = 0; 
  50. pool->queue_max_size = queue_max_size; 
  51. pool->shutdown = false
  52. /* 根據最大線程數,給工作線程數組開空間,清0 */ 
  53. pool->threads = (pthread_t *)malloc(sizeof(pthread_t)*max_thr_num); 
  54. if (pool->threads == NULL
  55. printf("malloc threads false;\n"); 
  56. break; 
  57. memset(pool->threads, 0, sizeof(pthread_t)*max_thr_num); 
  58. /* 隊列開空間 */ 
  59. pool->task_queue = 
  60. (threadpool_task_t *)malloc(sizeof(threadpool_task_t)*queue_max_size); 
  61. if (pool->task_queue == NULL
  62. printf("malloc task queue false;\n"); 
  63. break; 
  64. /* 初始化互斥鎖和條件變量 */ 
  65. if ( pthread_mutex_init(&(pool->lock), NULL) != 0 || 
  66. pthread_mutex_init(&(pool->thread_counter), NULL) !=0 || 
  67. pthread_cond_init(&(pool->queue_not_empty), NULL) !=0 || 
  68. pthread_cond_init(&(pool->queue_not_full), NULL) !=0) 
  69. printf("init lock or cond false;\n"); 
  70. break; 
  71. /* 啟動min_thr_num個工作線程 */ 
  72. for (i=0; i<min_thr_num; i++) 
  73. /* pool指向當前線程池 threadpool_thread函數在后面講解 */ 
  74. pthread_create(&(pool->threads[i]), NULL, threadpool_thread, (void *)pool); 
  75. printf("start thread 0x%x... \n", (unsigned int)pool->threads[i]); 
  76. /* 管理者線程 admin_thread函數在后面講解 */ 
  77. pthread_create(&(pool->admin_tid), NULL, admin_thread, (void *)pool); 
  78. return pool; 
  79. } while(0); 
  80. /* 釋放pool的空間 */ 
  81. threadpool_free(pool); 
  82. return NULL

二、線程數組

線程數組實際上是在線程池初始化時開辟的一段存放一堆線程tid的空間,在邏輯上形成一個池,里面放置著提前創建的線程;這段空間中包含了正在工作的線程,等待工作的線程(空閑線程),等待被銷毀的線程,申明但沒有初始化的線程空間;

線程池原理詳解及如何用C語言實現線程池
  1. /*工作線程*/ 
  2. void * 
  3. threadpool_thread(void *threadpool) 
  4. threadpool_t *pool = (threadpool_t *)threadpool; 
  5. threadpool_task_t task; 
  6. while (true
  7. pthread_mutex_lock(&(pool->lock)); 
  8. /* 無任務則阻塞在 “任務隊列不為空” 上,有任務則跳出 */ 
  9. while ((pool->queue_size == 0) && (!pool->shutdown)) 
  10. printf("thread 0x%x is waiting \n", (unsigned int)pthread_self()); 
  11. pthread_cond_wait(&(pool->queue_not_empty), &(pool->lock)); 
  12. /* 判斷是否需要清除線程,自殺功能 */ 
  13. if (pool->wait_exit_thr_num > 0) 
  14. pool->wait_exit_thr_num--; 
  15. /* 判斷線程池中的線程數是否大于最小線程數,是則結束當前線程 */ 
  16. if (pool->live_thr_num > pool->min_thr_num) 
  17. printf("thread 0x%x is exiting \n", (unsigned int)pthread_self()); 
  18. pool->live_thr_num--; 
  19. pthread_mutex_unlock(&(pool->lock)); 
  20. pthread_exit(NULL);//結束線程 
  21. /* 線程池開關狀態 */ 
  22. if (pool->shutdown) //關閉線程池 
  23. pthread_mutex_unlock(&(pool->lock)); 
  24. printf("thread 0x%x is exiting \n", (unsigned int)pthread_self()); 
  25. pthread_exit(NULL); //線程自己結束自己 
  26. //否則該線程可以拿出任務 
  27. task.function = pool->task_queue[pool->queue_front].function; //出隊操作 
  28. task.arg = pool->task_queue[pool->queue_front].arg; 
  29. pool->queue_front = (pool->queue_front + 1) % pool->queue_max_size; //環型結構 
  30. pool->queue_size--; 
  31. //通知可以添加新任務 
  32. pthread_cond_broadcast(&(pool->queue_not_full)); 
  33. //釋放線程鎖 
  34. pthread_mutex_unlock(&(pool->lock)); 
  35. //執行剛才取出的任務 
  36. printf("thread 0x%x start working \n", (unsigned int)pthread_self()); 
  37. pthread_mutex_lock(&(pool->thread_counter)); //鎖住忙線程變量 
  38. pool->busy_thr_num++; 
  39. pthread_mutex_unlock(&(pool->thread_counter)); 
  40. (*(task.function))(task.arg); //執行任務 
  41. //任務結束處理 
  42. printf("thread 0x%x end working \n", (unsigned int)pthread_self()); 
  43. pthread_mutex_lock(&(pool->thread_counter)); 
  44. pool->busy_thr_num--; 
  45. pthread_mutex_unlock(&(pool->thread_counter)); 
  46. pthread_exit(NULL); 

三、任務隊列

任務隊列的存在形式與線程數組相似;在線程池初始化時根據傳入的最大任務數開辟空間;當服務器前方后請求到來后,分類并打包消息成為任務,將任務放入任務隊列并通知空閑線程來取;不同之處在于任務隊列有明顯的先后順序,先進先出;而線程數組中的線程則是一個競爭關系去拿到互斥鎖爭取任務;

線程池原理詳解及如何用C語言實現線程池
  1. /*向線程池的任務隊列中添加一個任務*/ 
  2. int 
  3. threadpool_add_task(threadpool_t *pool, void *(*function)(void *arg), void *arg) 
  4. pthread_mutex_lock(&(pool->lock)); 
  5. /*如果隊列滿了,調用wait阻塞*/ 
  6. while ((pool->queue_size == pool->queue_max_size) && (!pool->shutdown)) 
  7. pthread_cond_wait(&(pool->queue_not_full), &(pool->lock)); 
  8. /*如果線程池處于關閉狀態*/ 
  9. if (pool->shutdown) 
  10. pthread_mutex_unlock(&(pool->lock)); 
  11. return -1; 
  12. /*清空工作線程的回調函數的參數arg*/ 
  13. if (pool->task_queue[pool->queue_rear].arg != NULL
  14. free(pool->task_queue[pool->queue_rear].arg); 
  15. pool->task_queue[pool->queue_rear].arg = NULL
  16. /*添加任務到任務隊列*/ 
  17. pool->task_queue[pool->queue_rear].function = function
  18. pool->task_queue[pool->queue_rear].arg = arg; 
  19. pool->queue_rear = (pool->queue_rear + 1) % pool->queue_max_size; /* 邏輯環 */ 
  20. pool->queue_size++; 
  21. /*添加完任務后,隊列就不為空了,喚醒線程池中的一個線程*/ 
  22. pthread_cond_signal(&(pool->queue_not_empty)); 
  23. pthread_mutex_unlock(&(pool->lock)); 
  24. return 0; 

四、管理者線程

作為線程池的管理者,該線程的主要功能包括:檢查線程池內線程的存活狀態,工作狀態;負責根據服務器當前的請求狀態去動態的增加或刪除線程,保證線程池中的線程數量維持在一個合理高效的平衡上;

說到底,它就是一個單獨的線程,定時的去檢查,根據我們的一個維持平衡算法去增刪線程;

  1. /*管理線程*/ 
  2. void * 
  3. admin_thread(void *threadpool) 
  4. int i; 
  5. threadpool_t *pool = (threadpool_t *)threadpool; 
  6. while (!pool->shutdown) 
  7. printf("admin -----------------\n"); 
  8. sleep(DEFAULT_TIME); /*隔一段時間再管理*/ 
  9. pthread_mutex_lock(&(pool->lock)); /*加鎖*/ 
  10. int queue_size = pool->queue_size; /*任務數*/ 
  11. int live_thr_num = pool->live_thr_num; /*存活的線程數*/ 
  12. pthread_mutex_unlock(&(pool->lock)); /*解鎖*/ 
  13. pthread_mutex_lock(&(pool->thread_counter)); 
  14. int busy_thr_num = pool->busy_thr_num; /*忙線程數*/ 
  15. pthread_mutex_unlock(&(pool->thread_counter)); 
  16. printf("admin busy live -%d--%d-\n", busy_thr_num, live_thr_num); 
  17. /*創建新線程 實際任務數量大于 最小正在等待的任務數量,存活線程數小于最大線程數*/ 
  18. if (queue_size >= MIN_WAIT_TASK_NUM && live_thr_num <= pool->max_thr_num) 
  19. printf("admin add-----------\n"); 
  20. pthread_mutex_lock(&(pool->lock)); 
  21. int add=0; 
  22. /*一次增加 DEFAULT_THREAD_NUM 個線程*/ 
  23. for (i=0; i<pool->max_thr_num && add<DEFAULT_THREAD_NUM 
  24. && pool->live_thr_num < pool->max_thr_num; i++) 
  25. if (pool->threads[i] == 0 || !is_thread_alive(pool->threads[i])) 
  26. pthread_create(&(pool->threads[i]), NULL, threadpool_thread, (void *)pool); 
  27. add++; 
  28. pool->live_thr_num++; 
  29. printf("new thread -----------------------\n"); 
  30. pthread_mutex_unlock(&(pool->lock)); 
  31. /*銷毀多余的線程 忙線程x2 都小于 存活線程,并且存活的大于最小線程數*/ 
  32. if ((busy_thr_num*2) < live_thr_num && live_thr_num > pool->min_thr_num) 
  33. // printf("admin busy --%d--%d----\n", busy_thr_num, live_thr_num); 
  34. /*一次銷毀DEFAULT_THREAD_NUM個線程*/ 
  35. pthread_mutex_lock(&(pool->lock)); 
  36. pool->wait_exit_thr_num = DEFAULT_THREAD_NUM; 
  37. pthread_mutex_unlock(&(pool->lock)); 
  38. for (i=0; i<DEFAULT_THREAD_NUM; i++) 
  39. //通知正在處于空閑的線程,自殺 
  40. pthread_cond_signal(&(pool->queue_not_empty)); 
  41. printf("admin cler --\n"); 
  42. return NULL
  43. /*線程是否存活*/ 
  44. int 
  45. is_thread_alive(pthread_t tid) 
  46. int kill_rc = pthread_kill(tid, 0); //發送0號信號,測試是否存活 
  47. if (kill_rc == ESRCH) //線程不存在 
  48. return false
  49. return true

五、釋放

  1. /*釋放線程池*/ 
  2. int 
  3. threadpool_free(threadpool_t *pool) 
  4. if (pool == NULL
  5. return -1; 
  6. if (pool->task_queue) 
  7. free(pool->task_queue); 
  8. if (pool->threads) 
  9. free(pool->threads); 
  10. pthread_mutex_lock(&(pool->lock)); /*先鎖住再銷毀*/ 
  11. pthread_mutex_destroy(&(pool->lock)); 
  12. pthread_mutex_lock(&(pool->thread_counter)); 
  13. pthread_mutex_destroy(&(pool->thread_counter)); 
  14. pthread_cond_destroy(&(pool->queue_not_empty)); 
  15. pthread_cond_destroy(&(pool->queue_not_full)); 
  16. free(pool); 
  17. pool = NULL
  18. return 0; 
  19. /*銷毀線程池*/ 
  20. int 
  21. threadpool_destroy(threadpool_t *pool) 
  22. int i; 
  23. if (pool == NULL
  24. return -1; 
  25. pool->shutdown = true
  26. /*銷毀管理者線程*/ 
  27. pthread_join(pool->admin_tid, NULL); 
  28. //通知所有線程去自殺(在自己領任務的過程中) 
  29. for (i=0; i<pool->live_thr_num; i++) 
  30. pthread_cond_broadcast(&(pool->queue_not_empty)); 
  31. /*等待線程結束 先是pthread_exit 然后等待其結束*/ 
  32. for (i=0; i<pool->live_thr_num; i++) 
  33. pthread_join(pool->threads[i], NULL); 
  34. threadpool_free(pool); 
  35. return 0; 

六、接口

  1. /* 線程池初始化,其管理者線程及工作線程都會啟動 */ 
  2. threadpool_t *thp = threadpool_create(10, 100, 100); 
  3. printf("threadpool init ... ... \n"); 
  4. /* 接收到任務后添加 */ 
  5. threadpool_add_task(thp, do_work, (void *)p); 
  6. // ... ... 
  7. /* 銷毀 */ 
  8. threadpool_destroy(thp); 

 

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2012-05-15 02:18:31

Java線程池

2020-12-10 08:24:40

線程池線程方法

2021-12-28 15:10:01

線程池C語言編程語言

2024-11-21 07:00:00

線程池Java開發

2021-09-11 07:32:15

Java線程線程池

2024-07-15 08:20:24

2018-10-31 15:54:47

Java線程池源碼

2023-05-19 08:01:24

Key消費場景

2024-05-06 11:19:20

內存池計算機編程

2023-08-02 08:03:08

Python線程池

2022-11-09 09:01:08

并發編程線程池

2012-02-01 11:20:23

Java線程

2023-11-29 16:38:12

線程池阻塞隊列開發

2021-05-26 11:30:24

Java線程池代碼

2024-11-13 16:37:00

Java線程池

2024-09-09 15:09:30

2025-08-11 02:00:00

2022-09-26 00:48:14

線程池阻塞數據

2023-10-13 08:20:02

Spring線程池id

2021-07-16 11:35:20

Java線程池代碼
點贊
收藏

51CTO技術棧公眾號

欧美成人精品三级在线观看| 国产欧美1区2区3区| 美日韩精品免费视频| 国产精久久久久| jizz亚洲少妇| 1区2区在线| 91女厕偷拍女厕偷拍高清| 国产精品99免视看9| 午夜成人亚洲理伦片在线观看| 欧美巨大xxxx做受沙滩| 波多野结衣中文一区| 国产成人亚洲综合91| 丝袜美腿小色网| 香蕉久久精品| 91精品国产综合久久久久久漫画 | 91wwwcom在线观看| 大吊一区二区三区| 老牛影视av一区二区在线观看| 欧美一a一片一级一片| 黄色激情在线视频| 午夜不卡视频| 久久免费看少妇高潮| 97人人模人人爽人人喊38tv| 国产精品免费无遮挡无码永久视频| 欧美福利电影在线观看| 夜夜躁日日躁狠狠久久88av| 国产日韩视频一区| 国产精品一区三区在线观看| 色域天天综合网| 成人短视频在线观看免费| 95在线视频| www久久久久| 国产高清一区视频| 国产绳艺sm调教室论坛| 青草av.久久免费一区| 5566成人精品视频免费| 一区二区视频免费看| 青青草原综合久久大伊人精品| 日韩国产高清视频在线| 亚洲精品综合在线观看| 日本精品网站| 欧美色xxxx| 男人添女人下面高潮视频| 欧美14一18处毛片| 一区二区三区在线观看视频| 中文字幕久精品免| jizz亚洲| 欧美国产精品中文字幕| 日韩三级电影网站| 黄色片在线免费观看| 91麻豆福利精品推荐| 国产一级精品aaaaa看| 日韩成人动漫| 欧美aaaaa成人免费观看视频| 久久免费视频这里只有精品| 国产成人av免费在线观看| 热久久天天拍国产| 国产一区二区三区中文| 手机免费看av| 国产乱码精品一区二区三区四区| 精品亚洲男同gayvideo网站| 18禁裸乳无遮挡啪啪无码免费| www.成人网| 亚洲第一区中文字幕| 蜜臀aⅴ国产精品久久久国产老师| 精品国产欧美| 精品三级av在线| 人妻激情偷乱频一区二区三区| 国产成人澳门| 日韩精品免费看| 精品国产成人亚洲午夜福利| 精品视频国产| 国产一区二区三区在线| 国产中文字幕久久| 自拍偷拍欧美专区| 久久久久久亚洲精品不卡| 久久精品国产亚洲AV无码麻豆| 亚洲国产专区| 国产成人精品av在线| 国产成人av免费| 国产在线视频不卡二| 国产成人精品日本亚洲11| 色婷婷av一区二区三区之e本道| av激情亚洲男人天堂| 欧美午夜欧美| 国产欧美久久久久久久久| 一区二区欧美国产| 欧美日韩中文在线视频| 久久精品xxxxx| 日韩欧美视频在线| 国产精品亚洲无码| 色婷婷亚洲mv天堂mv在影片| 欧美巨猛xxxx猛交黑人97人| 成人免费看片98欧美| 蜜桃视频在线一区| 国产欧美亚洲日本| 99青草视频在线播放视| 亚洲影视在线播放| 奇米影音第四色| 7777精品| 最近2019中文字幕在线高清| 国产一级生活片| 日韩va亚洲va欧美va久久| 99国内精品久久久久久久软件| 少妇激情av一区二区| 中文字幕亚洲精品在线观看 | jyzzz在线观看视频| 有码一区二区三区| 一级黄色香蕉视频| 成人h动漫精品一区二区器材| 亚洲人高潮女人毛茸茸| 久久亚洲成人av| 免费一级欧美片在线观看| 国产精品区一区| 日本高清在线观看wwwww色| 天天综合天天做天天综合| 久久久久xxxx| 久久av影视| 97热精品视频官网| 国产福利免费视频| 国产精品久久久久久久久动漫| 亚洲中文字幕无码av永久| 99精品国产九九国产精品| 亚洲最新av在线网站| 日韩欧美视频在线免费观看| 国产一级精品在线| 亚洲欧洲一二三| 欧美xxx视频| 亚洲精品国精品久久99热一| 久久国产精品二区| 六月婷婷色综合| 亚洲 国产 日韩 综合一区| 性欧美freesex顶级少妇| 日韩天堂在线观看| 东方av正在进入| 久久精品国内一区二区三区| 涩涩涩999| 国模套图日韩精品一区二区| 亚洲国产一区二区三区在线观看| a级片在线观看免费| 国产一区福利在线| 国产成年人在线观看| 久久爱.com| www.久久久久久.com| 在线观看免费视频a| 欧美激情资源网| 天天影视综合色| 久久av资源| 国产精品极品美女在线观看免费 | 国产亚洲一区| 日韩av电影手机在线观看| 水莓100在线视频| 欧美日韩午夜激情| 国产伦精品一区二区三区妓女| 在线欧美亚洲| 久久久综合香蕉尹人综合网| 国产资源在线观看入口av| 亚洲精品成人久久电影| 国产女同在线观看| 久久免费的精品国产v∧| 日韩中文字幕免费在线| 精品99在线| 国产日韩在线看| 国产成人l区| 精品国产不卡一区二区三区| 青青草成人av| 国产清纯美女被跳蛋高潮一区二区久久w | 成人激情视频在线播放| av观看在线| 亚洲第一av在线| 国产免费一级视频| 国产精品久久久久一区二区三区共| 国产91色在线观看| 欧美1区视频| 久久av免费观看| 99热播精品免费| 美女av一区二区三区| 欧洲精品久久一区二区| 色一区在线观看| 欧美一级片在线视频| 东方欧美亚洲色图在线| 亚洲色欲综合一区二区三区| 色狮一区二区三区四区视频| 成人av资源网| 欧美电影免费观看高清完整| 日韩视频一区在线| 天天干在线观看| 欧美日韩精品专区| 国产在线综合网| 欧美激情在线观看视频免费| 少妇欧美激情一区二区三区| 亚洲综合精品| 在线观看一区二区三区三州| 久久久久观看| 成人激情视频免费在线| 免费成人在线电影| www.日本久久久久com.| 天天射天天操天天干| 欧美人xxxx| 男女视频免费看| 亚洲免费观看在线观看| 精品成人av一区二区三区| 国产精品一卡二卡| 久久久国产欧美| 亚洲第一区色| 亚洲国产精品影视| 制服丝袜日韩| 国产精品裸体一区二区三区| 国产成人福利夜色影视| 欧美亚洲另类视频| 羞羞网站在线看| 在线精品国产欧美| 天堂а在线中文在线无限看推荐| 欧美精品乱码久久久久久按摩| 国产精品第9页| 一区二区三区在线看| 波兰性xxxxx极品hd| 久久免费国产精品| 国产高清成人久久| 国产福利一区二区| 亚洲午夜激情影院| 日韩高清在线不卡| 免费高清在线观看免费| 亚洲二区视频| 成人在线观看毛片| 亚洲精品国产成人影院| 亚洲日本无吗高清不卡| 久草在线成人| 欧美大香线蕉线伊人久久| 91精品国产自产在线丝袜啪 | 91tv国产成人福利| 在线精品亚洲一区二区不卡| 亚洲s码欧洲m码国产av| 婷婷六月综合亚洲| 日本少妇性高潮| 亚洲影院在线观看| 私库av在线播放| 亚洲女人小视频在线观看| 亚洲 欧美 国产 另类| 国产蜜臀97一区二区三区 | 亚洲色图视频免费播放| 亚洲ⅴ国产v天堂a无码二区| 久久久亚洲高清| 伊人网在线视频观看| 成人av资源在线观看| 国产黑丝在线观看| 成人97人人超碰人人99| 在线免费看黄色片| av一二三不卡影片| www.久久av| 久久精品网站免费观看| 亚洲自拍偷拍图| 草草影院在线观看| 国产一区二区三区在线| 成人亚洲性情网站www在线观看| 亚洲欧洲一区二区三区久久| 女人偷人在线视频| 在线电影中文日韩| 欧美日韩在线资源| 美女精品久久久| 爱看av在线入口| 91av视频在线免费观看| 制服丝袜专区在线| 国产精品看片资源| 国产精品黄色片| 亚洲在线免费看| 精品国产乱子伦一区二区| 精品一区二区视频| 牛牛影视久久网| 日本不卡一区二区三区视频| 久久精品不卡| 成年在线观看视频| 一本色道久久综合| 中文字幕国产传媒| 国产一区二区看久久| 亚洲精品乱码久久久久久蜜桃欧美| 99久久精品99国产精品 | 成人av一区二区三区在线观看| 精品日韩成人av| 欧美日韩在线精品一区二区三区激情综 | av电影在线播放| 久久综合九色综合久久久精品综合| 在线不卡av电影| 亚洲女爱视频在线| 精品成人久久久| 欧美曰成人黄网| 亚洲av综合色区无码一二三区| 亚洲电影免费观看高清完整版在线观看| 五月婷婷丁香六月| 自拍偷拍免费精品| 国产第一页在线视频| 国产激情999| 欧美二区观看| 日韩av在线电影观看| 欧美激情第8页| 青青青在线播放| 国产精品18久久久久久久网站| 亚洲观看黄色网| 999在线观看精品免费不卡网站| 人妻精品无码一区二区三区| 精东粉嫩av免费一区二区三区| 国产伦精品一区二区三区精品| 欧美激情资源网| 圆产精品久久久久久久久久久| 欧美日韩免费不卡视频一区二区三区 | 蜜桃视频动漫在线播放| 91欧美精品成人综合在线观看| 欧美偷窥清纯综合图区| 麻豆中文字幕在线观看| 水野朝阳av一区二区三区| 无码国产精品久久一区免费| 国产日韩成人精品| 国产情侣在线视频| 555夜色666亚洲国产免| 国产在线视频资源| 97激碰免费视频| 国产精品日本一区二区不卡视频| 久久资源亚洲| 亚洲国产专区校园欧美| 伊人五月天婷婷| 国产精品免费视频观看| www.毛片.com| 精品国产91亚洲一区二区三区婷婷| 在线视频自拍| 国产精品激情自拍| 欧美禁忌电影网| 成人黄色av片| 亚洲色图美国十次| 琪琪亚洲精品午夜在线| 精品女人视频| 欧美国产视频一区| 久久99精品久久久久| 久久久久久亚洲中文字幕无码| 亚洲午夜精品17c| 国产av无码专区亚洲av| xxx欧美精品| 欧美天堂一区二区| 午夜精品一区二区三区在线观看| 性欧美精品高清| 国产又爽又黄无码无遮挡在线观看| 亚洲一卡二卡三卡四卡| 亚洲黄色在线免费观看| 欧美成人精品在线观看| 综合久久伊人| 麻豆md0077饥渴少妇| 久久成人久久鬼色| 久久噜噜色综合一区二区| 欧美日韩一区不卡| 91caoporn在线| 国产一区二区在线免费视频| 视频在线不卡免费观看| 一女二男3p波多野结衣| 中文字幕一区二区三区蜜月| 国产一区二区三区成人| 久久视频在线直播| 日本综合精品一区| 国产精品va在线观看无码| 国产91在线|亚洲| 日本系列第一页| 亚洲精品综合久久中文字幕| 成人美女视频| 亚洲人成77777| 国产精品一二三区在线| 欧美日韩激情在线观看| 亚洲精品福利视频| 免费电影日韩网站| 午夜精品一区二区在线观看| 美女在线一区二区| 日本黄色片免费观看| 精品国产一区二区亚洲人成毛片 | 午夜精品久久久久久| 天堂网av2014| 国产成人久久精品| 98精品视频| 成人午夜精品无码区| 一本一本大道香蕉久在线精品 | 91成人国产在线观看| 久久99视频| 999久久久精品视频| 亚洲一区免费在线观看| 亚洲欧洲综合在线| 国产精品久久二区| 午夜精品视频| 西西444www无码大胆| 7799精品视频| 国产ktv在线视频| 亚洲欧美国产不卡| 高清不卡在线观看| 五月婷婷六月婷婷| 欧美激情一级二级| 国产麻豆一区二区三区精品视频| 国产乱女淫av麻豆国产| 无码av免费一区二区三区试看| www.av在线| 激情欧美一区二区三区中文字幕| 日本va欧美va精品| 国产成人在线播放视频| 日韩中文字幕在线| 日韩高清成人在线| 丰满少妇中文字幕|