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

Linux高性能編程-線程池

系統 Linux
?線程池就是提前創建好一批線程,通過一個池子來管理所有的線程。當有任務時,從池子中取出一個線程去執行該任務,執行結束后,線程并不會死亡,而是再次返回線程池中成為空閑狀態,等待執行下一個任務?。

今天我們來學習Linux線程池,線程池是高并發場景必須具備的軟件組件,很多開源項目都會使用線程池,話不多說,直接開始。

1.線程池簡介

1.1 什么是線程池?

    線程池就是提前創建好一批線程,通過一個池子來管理所有的線程。當有任務時,從池子中取出一個線程去執行該任務,執行結束后,線程并不會死亡,而是再次返回線程池中成為空閑狀態,等待執行下一個任務。

    我們通過幾個圖來講解一下線程池的作用。

1)常規多線程

圖片圖片

    常規多線程方式,每個任務都會創建一個新的線程來處理,任務處理完后線程會銷毀。

    優點:在任務量比較少的情況下,任務執行效率比較高。

    缺點:1.隨著任務量增多,線程數量會越來越多,線程開銷(CPU,內存開銷)很大,如果不控制線程數量,系統會出現異常。2.缺乏任務管理機制。3.缺乏多線程管理機制。

2)簡單的線程池

圖片圖片

    簡單線程池通過任務隊列和線程池完成。

    新任務產生后存儲在任務隊列,線程池中的空閑線程從任務隊列獲取任務并執行。

    優點:1.線程數量可控,能夠保證系統安全。2.任務和線程統一管理,方便程序設計。

    缺點:1.沒有任務拒絕機制,任務會堆積在任務隊列。2.線程池線程數量固定,無法動態調節線程數量,導致任務處理效率不高。

3)完善的線程池

圖片圖片

    完善的線程池需要具備一下幾個優點:

  • 多線程動態管理。
  • 任務實時響應。
  • 高并發安全保護機制。

    線程池被分為核心線程和動態線程,核心線程會一直運行保證基礎業務,當任務越來越多的時候,核心線程無法保證任務快速響應,此時需要通過創建動態線程提高線程響應速度。

    當動態線程到達極限時,系統的處理能力到達瓶頸,此時需要啟動安全保護機制,通過任務拒絕,保證系統安全。

1.2 線程池優點

通過上述分析,我們了解到線程池有以下優點:

  • 降低開銷:線程池通過重用已存在的線程,降低了線程的創建和銷毀所帶來的開銷,提高了性能。
  • 控制并發數:線程池能夠有效控制同時執行的線程數量,防止因線程過多導致系統資源耗盡或性能下降,提高系統穩定性。
  • 提高響應速度:由于線程池中的線程可以復用,減少了線程創建的時間,因此提高了任務的響應速度。
  • 提供豐富功能:線程池不僅可以執行普通任務,還提供定時執行、定期執行、單線程執行以及并發數控制等高級功能,使得線程的管理和使用更加靈活和高效。

2.線程池設計

2.1 整體設計

圖片

    設計一個完善的線程池,我們需要設計幾個核心模塊:狀態管理、線程管理,任務管理。

  • 狀態管理:管理線程池的生命周期。
  • 線程管理:管理核心線程和動態線程。
  • 任務管理:管理任務申請,任務拒絕以及任務高效調度。

2.2 詳細設計

    線程池定義(struct thread_pool):

typedef struct thread_pool {
    struct list_head head;   //任務隊列
    int task_max; //任務隊列最大長度
    int task_num; //任務隊列實際長度
    int core_num; //核心線程數量
    int dyn_max; //動態線程最大數量
    atomic_int dyn_num; //動態線程實際數量
    pthread_t *core_th; //核心線程pthread_t數組
    pthread_t *dyn_th; //動態線程pthread_t數組
    int status; //線程池狀態
    pthread_mutex_t mutex; //互斥鎖
    pthread_cond_t cond; //條件變量
} thread_pool_t;

    線程池通過struct thread_pool結構體定義,每個成員的作用已在代碼中注釋。

    創建線程池:

thread_pool_t* thread_pool_create(int core_num, int dyn_max) {
    thread_pool_t *tp = (thread_pool_t *)malloc(sizeof(thread_pool_t));
    if (!tp) return NULL;

    pthread_mutex_init(&tp->mutex, NULL);
    pthread_cond_init(&tp->cond, NULL);
    list_head_init(&tp->head);
    tp->status = INIT_STATUS;

    tp->task_max = TASK_MAX;
    tp->task_num = 0;
    tp->dyn_max = dyn_max;
    atomic_init(&tp->dyn_num, 0);
    tp->core_num = core_num;
    tp->core_th = malloc(core_num * sizeof(pthread_t));
    for (int i = 0; i < tp->core_num; i++) { //創建核心線程
        thread_arg *th_arg = (thread_arg *)malloc(sizeof(thread_arg));
        *th_arg = (thread_arg) {.tp = tp, .type = CORE_THREAD, .task = NULL};
        pthread_create(&tp->core_th[i], NULL, thread_proc, (void *)th_arg);
    }

    tp->status = RUNNING_STATUS; //設置線程池為running狀態

    return tp;
}

    線程池創建時會指定核心線程數量以及最大動態線程數量,核心線程跟著線程池一起創建。

    動態線程根據實際任務量動態創建,為了防止創建過多的動態線程,需限制動態線程最大數量。

    銷毀線程池:

void thread_pool_destroy_p(thread_pool_t **ptp) {
    if (!ptp) return;
    thread_pool_t *tp = *ptp;

    while(atomic_load(&tp->dyn_num)) { //等待動態線程全部退出
        usleep(10 * 1000);
    }

    for (int i = 0; i < tp->core_num; i++) { //等待核心線程全部退出
        pthread_join(tp->core_th[i], NULL);
    }

    free(tp->core_th);
    pthread_mutex_destroy(&tp->mutex);
    pthread_cond_destroy(&tp->cond);
    tp->status = STOP_STATUS; //設置線程池為stop狀態

    free(tp);
    ptp = NULL;
    return;
}

    線程池銷毀需要回收核心線程和動態線程,核心線程采用pthread_join方式回收。

    動態線程設置分離屬性,線程池成員dyn_num(原子變量)用于記錄仍在工作的動態線程數量,dyn_num等于0時表示當前所有的動態線程都已經退出。

2.2.1 狀態管理

    線程池整個生命周期可分為4個狀態:

#define INIT_STATUS (1<<0) //init狀態
#define RUNNING_STATUS (1<<1) //running狀態
#define SHUTDOWN_STATUS (1<<2) //shutdown狀態
#define STOP_STATUS (1<<3) //stop狀態
  • init狀態:線程池創建時的狀態,init狀態線程不能處理任務。
  • running狀態:線程池初始化完畢后設置為running狀態,此時線程池能夠提取任務并執行。
  • shutdown狀態:線程池正常或者異常退出,設置為shutdown狀態,此時線程池能繼續處理工作隊列中剩余任務,但無法再接收新的任務。
  • stop狀態:線程池所有線程全部釋放,線程池被銷毀。

2.2.2 線程管理

    核心線程和動態線程處理函數:

void *thread_proc(void *arg) {
    thread_arg *th_arg = (thread_arg *)arg;
    thread_pool_t *tp = th_arg->tp;
    pid_t tid = gettid();
     //動態線程設置成分離模式,方便管理 
     if (th_arg->type == DYN_THREAD) pthread_detach(pthread_self());

    int count = 0;
    task_t *task = NULL;
    while(1) {
        if (th_arg->task) { //創建線程并執行首次任務
            printf("tid:%d first process task\n", tid);
            task = th_arg->task;
            th_arg->task = NULL;
        } else {
            task = thread_get_task(tp); //從任務隊列中獲取任務并執行
            if (!task) {
                if (tp->status != RUNNING_STATUS) break; //線程池被關閉,線程退出
                count++;
                if ((count >= 10) && (th_arg->type == DYN_THREAD)) {
                    printf("dyn thread 10s break\n");
                    break; //動態線程空閑10秒自動退出
                }
                continue;
            }
            count = 0;
        }
        task->cb(task->arg);
        task_freep(&task);
    }

    free(th_arg);
    if (th_arg->type == DYN_THREAD) {
        atomic_fetch_sub(&tp->dyn_num, 1);
     }
    return NULL;
}

1)核心線程

    核心線程數量固定,在線程池創建時會創建所有的核心線程,線程池退出時會銷毀所有的核心線程。

2)動態線程

    動態線程的管理比較復雜,需要根據任務數量做動態調整,任務量大時,動態線程會被創建,提高線程池任務響應速率,任務量小時,空閑的動態線程會被回收,從而減少線程開銷。

2.2.3 任務管理

    任務定義(struct task):

typedef enum TASK_TYPE {
    FREE_TYPE,
    NOFREE_TYPE,
}TASK_TYPE;

typedef void (*func)(void *arg);
typedef struct task {
    struct list_head list; //隊列節點
    func cb; //回調函數
    void *arg; //回調函數參數
    TASK_TYPE type; //任務參數是否需要釋放
}task_t;

    任務通過struct task定義,任務主要成員:

  • list:隊列節點,用于插入和移除任務隊列。
  • cb:回調函數,任務處理函數。
  • arg:回調函數參數。
  • type:回調函數參數是否需要釋放標志。

    任務申請流程如下圖,創建一個新的任務后,需要做一些檢測才能將任務加入線程池,檢測不通過則執行任務拒絕,從而保證線程池始終處于安全高效運行狀態。

    任務執行完畢后,需釋放任務,回收資源。

圖片圖片

    線程池一定要做任務管理,任務管理的目的有兩個:

  • 保證線程池安全,不會堆積過多任務,消耗CPU和內存資源。
  • 提高任務處理效率。

3.線程池測試

    測試環境:樹莓派4B,4核,4GB。

    分別采用多線程和線程池方式測試CPU密集型和IO密集型任務,對比兩種方式性能和效率的差異。每毫秒產生1個任務,總共測試10000個任務。

    通過time命令執行測試程序,記錄測試程序執行情況。

    測試代碼如下:

    (完整代碼請聯系博主獲取)

#define CORE_THREAD_NUM (4) //核心線程數量
#define DYN_THREAD_MAX (32) //動態線程最大數量
#define TASK_MAX (128) //任務隊列任務最大數量

#define ENABLE_THREAD_POOL (0) //是否開啟線程池,0:關閉 1:開啟
#define TEST_TASK_NUM (10000) //測試任務數量
#define TASK_INTERVAL (1000) //任務產生間隔時間,單位:毫秒

#define TEST_TASK_TYPE (0) //任務類型,0:CPU密集型 1:IO密集型
#define NOP_TIMES (10000000) //CPU密集型任務執行空指令次數
#define RAND_RANGE (1 << 18) //IO密集型任務休眠時間隨機范圍,單位:毫秒

void cpu_stress() {
    for (int i = 0; i < NOP_TIMES; i++) {
        ;
    }
}

void rand_sleep() {
    srand(time(0));
    int ms = rand() & (RAND_RANGE - 1);
    usleep(ms);
}

//任務處理函數
void task_cb(void *arg) { 
#if !TEST_TASK_TYPE
    cpu_stress();
#else
    rand_sleep();
#endif
    return;
}

atomic_int running_threads;
void *thread_proc1(void *arg) {
    atomic_fetch_add(&running_threads, 1);
    pthread_detach(pthread_self());
    task_t *task = (task_t *)arg;
    task->cb(task->arg);
    free(task);
    atomic_fetch_sub(&running_threads, 1);
    return NULL;
}

int main(int argc, char *argv[]) {

#if ENABLE_THREAD_POOL
    thread_pool_t *tp = thread_pool_create(CORE_THREAD_NUM, DYN_THREAD_MAX);
    if (!tp) {
        printf("thread_pool_create error");
        return -1;
    }

    int seq = 0;
    while(1) {
        usleep(TASK_INTERVAL);
        task_t *task = task_create(task_cb, NULL, FREE_TYPE);
        if (!task) {
            printf("task create error\n");
            usleep(10 * 1000);
            continue;
        }
        int ret = thread_add_task(tp, task);
        if (ret == -1) { //任務拒絕
            task_freep(&task);
            usleep(10 * 1000);
            continue;
        }
        if (seq++ >= TEST_TASK_NUM) {
            thread_pool_exit(tp);
            thread_pool_destroy_p(&tp);
            break;
        }
    }
    printf("thread pool test done------\n");

#else
    atomic_init(&running_threads, 0);
    int seq = 0;
    int old_num = 0;
    while(1) {
        usleep(TASK_INTERVAL);
        task_t *task = task_create(task_cb, NULL, FREE_TYPE);
        if (!task) {
            printf("task create error\n");
            usleep(10 * 1000);
            continue;
        }
        pthread_t th;
        int ret = pthread_create(&th, NULL, thread_proc1, (void *)task);
        if (ret != 0) {
            free(task);
            usleep(10 * 1000);
            continue;
        }

        int num = atomic_load(&running_threads);
        if (old_num < num) {
            old_num = num;
            printf("running_threads:%d\n", num);
        }
        if (seq++ >= TEST_TASK_NUM) break;
    }
    printf("threads test done------\n");
#endif

    return 0;
}

1)CPU密集型場景測試

    測試參數如下:

圖片圖片

    多線程測試結果-->:

圖片圖片

圖片

    CPU使用率397%(已使用完),最高同時創建913個線程,完成測試時間2分鐘,用戶時間7分51秒,系統時間0.5秒。

    線程池測試結果-->:

圖片圖片

圖片

    CPU使用率398%(已使用完),核心線程4個,動態線程32個,共36各個線程,完成測試時間1分56秒,用戶時間7分41秒,系統時間0.04秒。

    小節:CPU密集場景多線程和線程池方式處理效率相差不大,多線程方式最多同時創建900多個線程,會消耗大量系統資源。線程池方式線程始終控制在36個,比較安全。

2)IO密集型場景測試

    測試參數如下:

圖片圖片

    多線程測試結果-->:

圖片圖片

圖片

    CPU使用率10.2%(已使用完),最高同時創建212個線程,完成測試時間11秒,用戶時間0.15秒,系統時間為1秒。

    線程池測試結果-->:

圖片圖片

圖片圖片

    CPU使用率3.6%(已使用完),核心線程4個,動態線程32個,共36各個線程,完成測試時間20秒,用戶時間0.25秒,系統時間為0.32秒。

    小節:IO密集型場景線程處于IO阻塞狀態,CPU使用率并不高,此時可以適當增加線程數量來提高CPU利用率。

總結:

  • 線程池能夠有效控制線程數量,防止線程過多對系統造成危害。
  • 線程池能夠高效管理任務,使軟件開發更方便、高效。
  • 從測試結果來看,多線程和線程池方式處理任務效率相差并不大,即使頻繁的創建和銷毀線程,也未對效率產生很大影響。
責任編輯:武曉燕 來源: 物聯網心球
相關推薦

2024-08-06 08:22:18

2024-09-03 09:15:37

2024-10-16 11:03:30

Linux高性能編程

2024-03-18 13:43:20

Linux架構

2023-11-01 11:20:57

2023-11-01 11:59:13

2022-03-21 14:13:22

Go語言編程

2023-11-01 11:27:10

Linux協程

2023-11-01 10:38:46

Linux高性能網絡編程

2023-11-01 11:40:46

Linux高性能網絡編程工具

2023-11-01 10:58:31

系統調用高性能網絡編程Linux

2023-11-01 11:51:08

Linux性能優化

2023-06-07 13:49:00

多線程編程C#

2020-11-06 18:51:17

LinuxTCP服務器

2023-11-01 11:07:05

Linux高性能網絡編程線程

2025-04-10 08:05:00

Netty線程池代碼

2017-01-10 13:39:57

Python線程池進程池

2025-04-23 00:00:00

2023-11-01 11:13:58

Linux信號處理定時器

2009-03-01 22:23:39

LinuxKernelLinuxDNA
點贊
收藏

51CTO技術棧公眾號

久久免费视频3| 成人性生交大片免费观看嘿嘿视频| 在线天堂www在线国语对白| 日韩av影片| 国产女人18水真多18精品一级做| 成人天堂噜噜噜| 国产成人自拍视频在线| 欧美色爱综合| 亚洲成人黄色网| 婷婷激情四射五月天| 羞羞污视频在线观看| 久久在线免费观看| 亚洲专区中文字幕| 无码人妻精品一区二区三区9厂 | 日韩av在线影院| 丝袜制服一区二区三区| yellow字幕网在线| 亚洲少妇中出一区| 免费看成人片| 成人av无码一区二区三区| 久久精品一区二区三区中文字幕| 日韩中文字幕视频在线观看| 国产无套精品一区二区三区| 不卡一二三区| 亚洲一区二区三区四区不卡| 亚洲欧洲一区二区福利| 日本国产在线| 国产69精品久久99不卡| 国产精品一区二区3区| 国产小视频在线免费观看| 亚洲欧洲中文字幕| 色妞在线综合亚洲欧美| 国产全是老熟女太爽了| 国内精品偷拍| 日韩欧美成人一区二区| 色噜噜狠狠永久免费| 欧美性猛交xxx高清大费中文| 亚洲综合一区二区三区| 亚洲美女自拍偷拍| av在线免费观看网| 久久久电影一区二区三区| 国产精品免费一区二区三区在线观看 | 成人写真视频福利网| 免费无码国产精品| 亚洲一区观看| 2025国产精品视频| 日韩精品一区三区| 亚洲国产一区二区精品专区| 欧美日本啪啪无遮挡网站| 日韩视频中文字幕在线观看| 香蕉综合视频| 成人444kkkk在线观看| 亚洲女人久久久| 999久久久精品国产| 色哟哟网站入口亚洲精品| 亚洲一二三四视频| 人人狠狠综合久久亚洲婷| 在线观看视频99| 国产综合精品久久久久成人av| 精品国产91乱码一区二区三区四区 | 亚洲精品国产首次亮相| 久久婷婷国产麻豆91天堂| 国产中文av在线| 亚洲九九视频| 欧美激情视频免费观看| 日本一区二区三区四区五区| 亚洲九九精品| 日本午夜精品理论片a级appf发布| 久久夜色精品国产噜噜亚洲av| 久久国产精品亚洲77777| 国产精品久久久久久久久| 中文无码av一区二区三区| 久久狠狠亚洲综合| 1区1区3区4区产品乱码芒果精品| 亚洲第一页综合| 91在线精品一区二区| 欧美少妇一区| 欧美jizzhd欧美| 亚洲综合激情网| 无码人妻丰满熟妇区96| 欧美aaa大片视频一二区| 欧美精品乱码久久久久久 | 成人免费观看49www在线观看| 欧美一区二区三区视频| 日本三级日本三级日本三级极| 亚洲成a人片77777在线播放| 国产亚洲精品激情久久| 男女做暖暖视频| 中文在线一区| 国产主播精品在线| 高潮毛片7777777毛片| 久久人人97超碰com| 中文字幕一区二区三区在线乱码| heyzo在线播放| 欧美亚日韩国产aⅴ精品中极品| 波多野结衣网页| 一本久久青青| 欧美xxxx综合视频| 6080午夜伦理| 成人一区二区三区视频| 视频一区视频二区视频| 欧美videos另类精品| 91成人免费在线| 亚洲v在线观看| 999精品一区| 欧洲美女7788成人免费视频| 国产视频一区二区三区四区五区| 久久久久久亚洲综合影院红桃| 欧美激情综合色综合啪啪| 亚洲精品日日夜夜| 国产成人久久婷婷精品流白浆| 97精品资源在线观看| 日韩的一区二区| 91九色丨porny丨极品女神| 在线欧美三区| 亚洲a中文字幕| www.国产精品.com| 精品久久久久久久久久国产 | 欧美天堂视频| 亚洲精品一线二线三线无人区| 国产91在线播放九色| 国产精品一二| 国产不卡一区二区在线观看| 日本高清中文字幕在线| 日韩欧美国产一区二区| 人妻体体内射精一区二区| 日本大胆欧美| 日本人成精品视频在线| 五月色婷婷综合| 亚洲最色的网站| 亚洲理论中文字幕| 日韩免费在线| 国产精品嫩草视频| 国产在线观看精品一区| 欧美性高潮在线| jizz日本免费| 亚洲国产第一| 国产精品播放| 久久免费电影| 欧美va亚洲va在线观看蝴蝶网| 国产男女猛烈无遮挡在线喷水| 日本视频一区二区三区| 免费影院在线观看一区| 激情黄产视频在线免费观看| 亚洲成色www8888| 久久精品国产亚洲av高清色欲 | 日本少妇高潮喷水xxxxxxx| 亚洲经典在线看| 国产精品乱码一区二区三区| av在线网页| 亚洲福利在线视频| 91久久国产视频| 久久综合九色综合久久久精品综合| 日韩中字在线观看| 精品中国亚洲| 青青a在线精品免费观看| 欧美美女搞黄| 在线免费亚洲电影| 国产福利在线导航| 国内精品自线一区二区三区视频| 伊人久久大香线蕉综合75| 四虎精品在线观看| 久久久av电影| 亚洲精品久久久久久无码色欲四季| 亚洲综合区在线| 国产白嫩美女无套久久| 天使萌一区二区三区免费观看| 欧美一区二区综合| 精品久久福利| 九九久久精品一区| 午夜成人免费影院| 91福利国产精品| 女人18毛片毛片毛片毛片区二 | 女人十八毛片嫩草av| 蜜臀av性久久久久蜜臀aⅴ| 在线观看成人av电影| 色妞ww精品视频7777| 欧美精品videos| 日本不卡视频一区二区| 在线观看欧美黄色| 午夜爱爱毛片xxxx视频免费看| 国产成人av福利| 日韩黄色片视频| 色婷婷色综合| 国模精品一区二区三区| 新片速递亚洲合集欧美合集| 久久久www成人免费精品张筱雨| 精品二区在线观看| 一本色道久久综合亚洲精品按摩| 亚洲一区电影在线观看| 成人一区二区视频| 午夜激情在线观看视频| 好吊一区二区三区| 日本一区二区三区精品视频| 日韩成人18| 国产99视频精品免视看7| av在线导航| 亚洲欧美日韩国产成人| 精品国产av 无码一区二区三区| 高潮白浆女日韩av免费看| 天天操夜夜操av| 91亚洲精品乱码久久久久久蜜桃| 亚洲天堂2018av| 香蕉精品999视频一区二区 | 99久久99久久精品免费| 国产精品亚洲一区二区三区妖精 | 欧美国产欧美综合| 无码人妻精品一区二区三| 日本欧美在线观看| 黄色一级视频在线播放| 国产高清一区二区| 欧美深深色噜噜狠狠yyy| 国产成人精品福利| 成人女保姆的销魂服务| 三级成人在线| 久久久久久伊人| 麻豆av在线免费看| 精品福利av导航| 国产精品免费人成网站酒店| 91日韩在线专区| 日本女人性视频| 麻豆视频观看网址久久| 日韩精品一区二区三区久久| 欧美精品自拍| 中文字幕av日韩精品| 国产精品一区二区av交换| 国产精品一区二| 国产亚洲字幕| 成人免费视频网址| 国产精品麻豆成人av电影艾秋| 91精品国产91久久久久久最新| 天堂va在线| 欧美成人sm免费视频| 免费a级人成a大片在线观看| 在线观看日韩欧美| 在线精品一区二区三区| 精品一区二区久久| 亚洲无吗一区二区三区| 香蕉久久久久久久av网站| 日韩精品一区二区三区久久| 亚洲免费高清| 国产精品久久..4399| 狠狠久久婷婷| 美脚丝袜脚交一区二区| 国内精品久久久久久久97牛牛| 四虎精品欧美一区二区免费| 中文字幕一区二区av | 日本91av在线播放| 免费成人在线电影| 欧美性视频网站| 亚洲精品**中文毛片| 欧美最顶级的aⅴ艳星| 91精品论坛| 国产精品wwww| 韩国成人在线| 国产一区在线播放| 国产精品国产三级在线观看| 亚洲影院色无极综合| 永久免费精品视频| 国产欧美日韩一区二区三区| 欧美大奶一区二区| 欧美专区一二三| 日韩欧美一区免费| 欧美aaa在线观看| 亚洲一级特黄| 精品国产免费av| 日本一区中文字幕| 拔插拔插华人永久免费| 国产激情视频一区二区在线观看| 白嫩情侣偷拍呻吟刺激| 久久奇米777| 亚洲 欧美 变态 另类 综合| 夜夜嗨av一区二区三区网页| 久久久午夜影院| 欧美专区日韩专区| 国产乱色精品成人免费视频| 欧美不卡激情三级在线观看| 日夜干在线视频| zzjj国产精品一区二区| 99在线视频影院| 国产精品美乳一区二区免费| 精品一区二区三区视频在线播放| 成人欧美一区二区三区视频| 免费欧美一区| 一二三四中文字幕| 久久www成人_看片免费不卡| 污污的视频免费| 91首页免费视频| av最新在线观看| 欧美视频二区36p| 99视频国产精品免费观看a | 干b视频在线观看| 亚洲女同女同女同女同女同69| 男人的天堂一区二区| 欧美日韩不卡一区| 五月婷中文字幕| 欧美成人在线免费视频| 桃花岛tv亚洲品质| 超碰国产精品久久国产精品99| 久久综合色占| 欧日韩免费视频| 精品一区免费av| 中文字幕丰满孑伦无码专区| 一区二区在线观看不卡| 亚洲成人av网址| 日韩av中文在线| 在线播放蜜桃麻豆| 国产精品黄色av| 欧美1区二区| 亚洲精品天堂成人片av在线播放 | 精品久久久久久无码人妻| 国产精品天美传媒沈樵| 中国一级免费毛片| 日韩精品一区二区在线观看| 91短视频版在线观看www免费| 26uuu亚洲国产精品| 91在线一区| aaa免费在线观看| 免费观看在线色综合| 一本色道久久综合亚洲精品图片| 欧产日产国产精品视频| 91免费国产网站| 欧美理论在线播放| 免费看一级大黄情大片| 国产成人av电影在线| 青花影视在线观看免费高清| 欧美在线观看视频一区二区| 亚洲 欧美 激情 小说 另类| 久久久免费精品视频| 高清不卡一区| 一区二区三区我不卡| 日本少妇一区二区| 欧美另类z0zx974| 一本久久a久久免费精品不卡| 成人久久精品人妻一区二区三区| 精品国偷自产在线| 久久久精品一区二区毛片免费看| 欧洲一区二区日韩在线视频观看免费| 在线日韩电影| 妖精视频一区二区| 亚洲愉拍自拍另类高清精品| av免费观看网址| 欧美成人合集magnet| 日韩精品一区二区三区免费视频| 潘金莲一级淫片aaaaa免费看| 狠狠色丁香久久婷婷综| 91久久国产综合| 欧美大片一区二区三区| 免费在线播放电影| 国产伦精品一区二区三区四区视频| 一区在线视频| 懂色av粉嫩av蜜乳av| 欧美性少妇18aaaa视频| 精品欧美不卡一区二区在线观看 | 日韩在线免费av| 日本一区二区中文字幕| 亚洲美女自拍偷拍| 国产激情精品久久久第一区二区| 一区二区三区免费高清视频| 欧美精品一区二区三区蜜桃视频 | 7777精品久久久大香线蕉| 成年视频在线观看| 国产精品香蕉视屏| 一本色道久久综合| 国产123在线| 555www色欧美视频| 国产色婷婷在线| 久久综合入口| 奇米色一区二区| 青青草偷拍视频| 亚洲精品视频在线播放| 99久久精品一区二区成人| 欧美 日韩 国产 在线观看 | 国产视频一区二区不卡| 嫩草成人www欧美| 永久av免费网站| 日韩成人在线视频| 高清在线一区| 国产乱子伦精品无码专区| 久久综合色天天久久综合图片| 中文字幕在线2019| 欧美激情免费在线| 欧美欧美黄在线二区| 欧美专区第二页| 欧美性猛交xxxxx水多| 免费在线看a| 麻豆av一区二区三区久久| 久久精品国产精品青草| 日本一级黄色大片| 中文字幕精品—区二区| 91麻豆精品国产91久久久久推荐资源| 国产精品丝袜久久久久久消防器材| 国产精品久久久久婷婷| 天堂在线视频免费| 国产美女久久精品| 中文一区二区| 欧美爱爱小视频| 一区二区三区视频在线| 成人动漫视频| 日韩成人av免费|