精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91精品国产综合久久婷婷香蕉 | 人人干人人干人人| 大地资源中文在线观看免费版| 日韩精品久久理论片| 色妞欧美日韩在线| 国产女人18毛片水真多18| 欧美三区四区| 亚洲美女视频一区| 欧美一区二区三区四区夜夜大片| 一级黄色片网站| 亚洲黄色视屏| www.日韩欧美| 国产又粗又长又爽| 亚洲欧美专区| 欧美三级免费观看| 欧美国产综合在线| seseavlu视频在线| av亚洲精华国产精华精华| 国产精品无码专区在线观看| 久久久久久久久久免费视频| 亚州av乱码久久精品蜜桃| 亚洲欧洲日韩国产| 欧美熟妇精品一区二区| 成人一级视频| 欧美日韩免费网站| 国产精品日韩三级| 国产在线看片| 国产精品情趣视频| 久久大片网站| 蜜桃久久一区二区三区| 久久99国内精品| 国产精品678| 久草视频在线观| 亚洲国产精品久久久天堂| 在线播放国产精品| 男女做爰猛烈刺激| 亚洲成在人线免费观看| 亚洲精品久久久一区二区三区 | 伊人久久综合97精品| 伊人网综合视频| 97久久亚洲| 日韩欧美一区二区视频| www.五月天色| 伊人亚洲精品| 91精品国产91久久久久久一区二区| 农村妇女精品一二区| 中文在线аv在线| 亚洲aaa精品| 加勒比成人在线| 丁香花在线高清完整版视频| 亚洲激情在线播放| 精品一区二区三区毛片| 米奇精品一区二区三区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | wwwav在线播放| 国产一区二区伦理片| 成人黄色在线免费| 国产日韩精品suv| 韩国av一区二区三区四区 | 精品二区在线观看| 国产美女在线精品| yellow视频在线观看一区二区 | 国产盗摄女厕一区二区三区| 999久久久| 欧美少妇bbw| 99精品欧美一区二区蜜桃免费| 国产伦精品一区二区三区视频黑人| 日本高清视频免费观看| 99久久国产综合精品色伊| 欧美激情专区| 北岛玲一区二区三区| 中文字幕亚洲在| 91免费版看片| 亚洲插插视频| 欧美日韩久久久| 国产裸体视频网站| 国产欧美三级电影| 亚洲色图综合网| 国产suv一区二区三区| 亚洲无毛电影| 国产精品igao视频| 国产精品久久无码一三区| 国产精品亚洲一区二区三区在线| 国产精品一区二区免费看| 欧美日韩激情视频一区二区三区| 国产精品美女久久久久久久| 浴室偷拍美女洗澡456在线| av丝袜在线| 在线观看视频一区二区欧美日韩| 日本中文字幕二区| 日韩大胆成人| 久久精品电影网站| www.av麻豆| 美女精品自拍一二三四| 国产精品二区在线观看| 国产区高清在线| 亚洲精品视频免费观看| 日韩a在线播放| 国内精品视频| 亚洲男女性事视频| 欧美亚洲日本在线| 日韩电影免费一区| 国产精品一区二区你懂得| 1024国产在线| 精品成人av一区| 午夜久久福利视频| 亚洲精品蜜桃乱晃| 欧美多人爱爱视频网站| 成人免费视频国产免费| 丁香激情综合国产| 尤物国产精品| 毛片无码国产| 亚洲精品v欧美精品v日韩精品 | 亚洲1区2区3区4区| 色天使在线观看| 国产尤物久久久| 午夜精品一区二区三区在线视 | 欧美人与动牲交xxxxbbbb| 欧美日韩尤物久久| 亚洲精品久久久久久久久久久久久| 91插插插插插插| 老司机午夜精品99久久| 欧美 日韩 国产在线| 2019中文字幕在线电影免费| 制服丝袜亚洲网站| 日本欧美一区二区三区不卡视频| 日韩一级大片| 99久久精品免费看国产四区| 欧美jizz18性欧美| 欧美日韩在线播放三区四区| 国产福利短视频| 日韩一级精品| 国产综合精品一区二区三区| 日本无删减在线| 欧美一区二区三区性视频| 国产又粗又猛又爽又黄的视频四季| 亚洲一区二区三区免费在线观看| 国产成人精品日本亚洲11| 182tv在线播放| 欧美一区二区三区四区在线观看| 99自拍偷拍视频| 美女网站一区二区| 伊人久久av导航| 亚瑟国产精品| 久久亚洲精品成人| 国产伦子伦对白视频| 中文字幕亚洲成人| 中文字幕第10页| 一区二区三区国产精华| 91超碰rencao97精品| 污影院在线观看| 日韩欧美成人一区二区| 久久久久久久福利| 成人免费av网站| 欧美日韩一道本| 五月天亚洲一区| 国产成人一区二区三区电影| 国产黄在线看| 欧美色图在线观看| 天天操夜夜操av| 国产精品中文字幕欧美| 欧美中日韩在线| 综合国产视频| 国产精品自拍偷拍视频| 黄色免费在线观看网站| 日韩精品自拍偷拍| 亚州国产精品视频| 久久尤物电影视频在线观看| 已婚少妇美妙人妻系列| 成人在线免费观看91| 国产欧美日韩高清| 欧美色图天堂| 亚洲精品永久免费| 这里只有精品9| 亚洲自拍偷拍麻豆| 成人免费av片| 精品一区二区三区蜜桃| 国产视频在线观看网站| 欧亚精品一区| 国产精品直播网红| 欧美人动性xxxxz0oz| 精品亚洲一区二区| 国产原创中文av| 亚洲成人一区二区在线观看| 手机看片福利视频| 国产美女娇喘av呻吟久久| 激情五月宗合网| 久久综合国产| 国产亚洲一区二区三区在线播放| 91tv亚洲精品香蕉国产一区| 欧美精品免费看| 男女av在线| 91精品国产91久久综合桃花| 天堂网中文字幕| 亚洲欧美激情小说另类| 久久人妻一区二区| 精品一区二区免费视频| 日本a在线免费观看| 久久国产精品亚洲人一区二区三区| 不卡视频一区二区| 成人在线免费| 欧美性在线视频| h网站久久久| 在线播放国产精品| 欧美一级在线免费观看| 欧美绝品在线观看成人午夜影视| 中文字幕亚洲精品一区| 一区二区在线电影| 9.1片黄在线观看| 91麻豆精品一区二区三区| 一个人看的视频www| 秋霞国产午夜精品免费视频| 黄色一级视频片| 欧美日本一区二区视频在线观看 | 美女av免费看| 久久久精品综合| 国产日韩视频一区| 国产一区美女在线| 成人免费在线观看视频网站| 亚洲在线播放| 国产精品又粗又长| 欧美精品二区| 91社在线播放| 久久亚洲成人| 日韩欧美视频一区二区三区四区| 欧美变态网站| 国产视频一区二区不卡| 日韩08精品| 亚洲伊人一本大道中文字幕| 日本久久二区| 国产精品亚洲欧美导航| 成人在线视频播放| 日本久久久久久久久久久| cao在线视频| 韩剧1988在线观看免费完整版 | 国产精品女人网站| 欧美粗大gay| 日本乱人伦a精品| 97se综合| 日本欧美中文字幕| 伊人久久视频| 国产aⅴ夜夜欢一区二区三区 | 欧美亚洲国产一区在线观看网站| 好吊妞视频一区二区三区| 精品成人在线视频| 在线看成人av| 精品国产成人av| 中文字幕超碰在线| 色哟哟精品一区| 在线免费一级片| 911精品国产一区二区在线| 一区二区三区午夜| 欧美一区二区精品在线| 精品毛片一区二区三区| 欧美v日韩v国产v| 少妇一区二区三区四区| 日韩成人激情在线| 久久精品蜜桃| 自拍偷拍亚洲一区| 自拍亚洲图区| 午夜精品在线视频| 小黄鸭精品aⅴ导航网站入口| 国产精品久久久| 亚洲伦理一区二区| 国产乱码精品一区二区三区不卡| 国产精品qvod| 色一情一区二区三区四区| 日韩国产专区| 久久久久福利视频| 国产日韩欧美高清免费| 不卡av免费在线| 久久97超碰色| 中文字幕在线播放一区| 久久久777精品电影网影网| 亚洲国产精品一区二区久久hs| 18成人在线观看| 久久精品国产亚洲av无码娇色| 欧美性极品少妇精品网站| 一区二区 亚洲| 欧美不卡一区二区| 免费看男男www网站入口在线| 丝袜情趣国产精品| 川上优av中文字幕一区二区| 国产xxx69麻豆国语对白| 日本少妇精品亚洲第一区| 欧美在线播放一区| 欧美99久久| 国产精品69页| 成人免费视频app| 性爱在线免费视频| 亚洲成人精品一区| 亚洲图片小说视频| 日韩电影中文字幕一区| 中文日本在线观看| 午夜伦理精品一区| 国产在线视频欧美一区| 欧美一区二区高清在线观看| 一区二区影院| 少妇黄色一级片| a美女胸又www黄视频久久| 日本精品在线免费观看| 一本到三区不卡视频| 国产黄色大片网站| 中文字幕亚洲欧美日韩在线不卡| 182在线播放| 91在线观看免费| 国产亚洲一区| 亚洲熟妇无码另类久久久| 国产制服丝袜一区| 91精品人妻一区二区三区| 亚洲午夜电影网| 国产精品自偷自拍| 中文一区二区视频| 成人影院入口| 国产视色精品亚洲一区二区| 亚洲h色精品| 污视频网址在线观看| 久久一区二区三区国产精品| 久久精品国产亚洲AV无码男同| 51久久夜色精品国产麻豆| 98在线视频| 国产成人高清激情视频在线观看| 国产成人av毛片| 国产免费xxx| 久久爱另类一区二区小说| 色综合99久久久无码国产精品| 五月天激情小说综合| 亚洲成人一级片| 欧美成人在线免费| 疯狂欧洲av久久成人av电影| 神马影院我不卡午夜| 天堂一区二区在线| 亚洲av综合一区二区| 黑人巨大精品欧美一区二区免费| 高h震动喷水双性1v1| 欧美肥臀大乳一区二区免费视频| 豆花视频一区| 中文字幕日韩精品无码内射| 国产精品综合一区二区三区| 五月综合色婷婷| 91精品国产黑色紧身裤美女| 欧美激情视频在线播放| 91视频国产高清| 伊人久久大香线| 韩国三级在线看| 精品国产乱码久久久久久天美| 欧美视频在线观看一区二区三区| 久久久欧美一区二区| 给我免费播放日韩视频| 久色视频在线播放| 久久久精品蜜桃| 中国女人真人一级毛片| 日韩中文字幕国产| 亚洲欧洲一二区| 日韩精品福利片午夜免费观看| 国产麻豆精品在线观看| 毛片aaaaa| 亚洲精品720p| **在线精品| 亚洲精品日韩在线观看| 久久国产麻豆精品| 欧美日韩在线国产| 亚洲国产免费av| 性欧美1819sex性高清| 精品久久免费观看| 国产成人一区二区精品非洲| 日本午夜小视频| 亚洲色图色老头| 精品国产乱码久久久久久樱花| 免费看欧美一级片| 久久久久国产成人精品亚洲午夜 | 精品国偷自产国产一区| 国产在线美女| 水蜜桃一区二区三区| 国产一区视频网站| 五月婷婷激情网| 在线免费观看羞羞视频一区二区| 国产精品一区免费在线| av在线播放亚洲| 中文字幕一区二区三| 日韩在线观看视频一区二区三区| 日韩美女主播视频| 欧美成人日本| 在线视频第一页| 欧美α欧美αv大片| 四虎成人在线| 精品国产av无码一区二区三区| 国产丝袜美腿一区二区三区| 国产精品伦一区二区三区| 91精品成人久久| 国产精品久久久久无码av| 亚洲无人区码一码二码三码| 在线观看三级视频欧美| 成年人视频免费在线播放| 四虎永久在线精品免费一区二区| 国产精一区二区三区| www.亚洲激情| 91国产美女视频| 欧美区亚洲区| 91ts人妖另类精品系列|