青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 40, 文章 - 0, 評論 - 9, 引用 - 0
數(shù)據(jù)加載中……

Linux下多線程編程詳解

http://www.yuanma.org/data/2007/0921/article_2859.htm

線程(thread)技術(shù)早在60年代就被提出,但真正應(yīng)用多線程到操作系統(tǒng)中去,是在80年代中期,solaris是這方面的佼佼者。傳統(tǒng)的Unix也支持線程的概念,但是在一個進程(process)中只允許有一個線程,這樣多線程就意味著多進程。
現(xiàn)在,多線程技術(shù)已經(jīng)被許多操作系統(tǒng)所支持,包括Windows/NT,當(dāng)然,也包括Linux。

  為什么有了進程的概念后,還要再引入線程呢?使用多線程到底有哪些好處?什么的系統(tǒng)應(yīng)該選用多線程?我們首先必須回答這些問題。

使用多線程的理由之一是和進程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式。我們知道,在Linux系統(tǒng)下,啟動一個新的進程必須分配給它獨立的地址空 間,建立眾多的數(shù)據(jù)表來維護它的代碼段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址 空間,共享大部分數(shù)據(jù),啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。 據(jù)統(tǒng)計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當(dāng)然,在具體的系統(tǒng)上,這個數(shù)據(jù)可能會有較大的區(qū)別。

  使用多線程 的理由之二是線程間方便的通信機制。對不同進程來說,它們具有獨立的數(shù)據(jù)空間,要進行數(shù)據(jù)的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方 便。線程則不然,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。當(dāng)然,數(shù)據(jù)的共享也帶來其他 一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災(zāi)難性的打擊,這些正是編寫多線程程序時最 需要注意的地方。

  除了以上所說的優(yōu)點外,不和進程比較,多線程程序作為一種多任務(wù)、并發(fā)的工作方式,當(dāng)然有以下的優(yōu)點:

  1) 提高應(yīng)用程序響應(yīng)。這對圖形界面的程序尤其有意義,當(dāng)一個操作耗時很長時,整個系統(tǒng)都會等待這個操作,此時程序不會響應(yīng)鍵盤、鼠標、菜單的操作,而使用多線程技術(shù),將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況。

  2) 使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當(dāng)線程數(shù)不大于CPU數(shù)目時,不同的線程運行于不同的CPU上。

  3) 改善程序結(jié)構(gòu)。一個既長又復(fù)雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。

  下面我們先來嘗試編寫一個簡單的多線程程序。

  簡單的多線程編程

Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時需要 使用庫libpthread.a。順便說一下,Linux下pthread的實現(xiàn)是通過系統(tǒng)調(diào)用clone()來實現(xiàn)的。clone()是Linux所特 有的系統(tǒng)調(diào)用,它的使用方式類似fork,關(guān)于clone()的詳細情況,有興趣的讀者可以去查看有關(guān)文檔說明。下面我們展示一個最簡單的多線程程序 pthread_create.c。


一個重要的線程創(chuàng)建函數(shù)原型:
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);

    返回值:若是成功建立線程返回0,否則返回錯誤的編號
    形式參數(shù):
                pthread_t *restrict tidp 要創(chuàng)建的線程的線程id指針
                const pthread_attr_t *restrict attr 創(chuàng)建線程時的線程屬性
                void* (start_rtn)(void) 返回值是void類型的指針函數(shù)
                void *restrict arg   start_rtn的行參
                
例程1:                               
    功能:創(chuàng)建一個簡單的線程
    程序名稱:pthread_create.c         
/********************************************************************************************
**    Name:pthread_create.c
**    Used to study the multithread programming in Linux OS
**    Author:zeickey
**    Date:2006/9/16       
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/

#include <stdio.h>
#include <pthread.h>

void *myThread1(void)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("This is the 1st pthread,created by zieckey.\n");
        sleep(1);//Let this thread to sleep 1 second,and then continue to run
    }
}

void *myThread2(void)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("This is the 2st pthread,created by zieckey.\n");
        sleep(1);
    }
}

int main()
{
    int i=0, ret=0;
    pthread_t id1,id2;
   
    ret = pthread_create(&id2, NULL, (void*)myThread1, NULL);
    if (ret)
    {
        printf("Create pthread error!\n");
        return 1;
    }
   
    ret = pthread_create(&id2, NULL, (void*)myThread2, NULL);
    if (ret)
    {
        printf("Create pthread error!\n");
        return 1;
    }
   
    pthread_join(id1, NULL);
    pthread_join(id2, NULL);
   
    return 0;
}


  我們編譯此程序:
# gcc pthread_create.c -lpthread

因為pthread的庫不是linux系統(tǒng)的庫,所以在進行編譯的時候要加上-lpthread,否則編譯不過,會出現(xiàn)下面錯誤
thread_test.c: 在函數(shù) ‘create’ 中:
thread_test.c:7: 警告: 在有返回值的函數(shù)中,程序流程到達函數(shù)尾
/tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):對‘pthread_create’未定義的引用
collect2: ld 返回 1

  運行,我們得到如下結(jié)果:
# ./a.out
This is the 1st pthread,created by zieckey.
This is the 2st pthread,created by zieckey.
This is the 1st pthread,created by zieckey.
This is the 2st pthread,created by zieckey.
This is the 2st pthread,created by zieckey.
This is the 1st pthread,created by zieckey.
....

兩個線程交替執(zhí)行。
此例子介紹了創(chuàng)建線程的方法。
下面例子介紹向線程傳遞參數(shù)。


例程2:
    功能:向新的線程傳遞整形值
    程序名稱:pthread_int.c
/********************************************************************************************
**    Name:pthread_int.c
**    Used to study the multithread programming in Linux OS
**    Pass a parameter to the thread.
**    Author:zeickey
**    Date:2006/9/16       
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *create(void *arg)
{
    int *num;
    num=(int *)arg;
    printf("create parameter is %d \n",*num);
    return (void *)0;
}
int main(int argc ,char *argv[])
{
    pthread_t tidp;
    int error;
   
    int test=4;
    int *attr=&test;
   
    error=pthread_create(&tidp,NULL,create,(void *)attr);

    if(error)
        {
        printf("pthread_create is created is not created ... \n");
        return -1;
        }
    sleep(1);
    printf("pthread_create is created ...\n");
    return 0;       
}


    編譯方法:

gcc -lpthread pthread_int.c -Wall


    執(zhí)行結(jié)果:

create parameter is 4
pthread_create is created is  created ...


    例程總結(jié):
    可以看出來,我們在main函數(shù)中傳遞的整行指針,傳遞到我們新建的線程函數(shù)中。
    在上面的例子可以看出來我們向新的線程傳入了另一個線程的int數(shù)據(jù),線程之間還可以傳遞字符串或是更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
例程3:
    程序功能:向新建的線程傳遞字符串
        程序名稱:pthread_string.c
/********************************************************************************************
**    Name:pthread_string.c
**    Used to study the multithread programming in Linux OS
**    Pass a ‘char*‘ parameter to the thread.
**    Author:zeickey
**    Date:2006/9/16       
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *create(void *arg)
{
    char *name;
    name=(char *)arg;
    printf("The parameter passed from main function is %s  \n",name);
    return (void *)0;
}

int main(int argc, char *argv[])
{
    char *a="zieckey";
    int error;
    pthread_t tidp;

    error=pthread_create(&tidp, NULL, create, (void *)a);

    if(error!=0)
    {
        printf("pthread is not created.\n");
        return -1;
    }
    sleep(1);
    printf("pthread is created... \n");
    return 0;
}   

  編譯方法:

gcc -Wall pthread_string.c -lpthread


    執(zhí)行結(jié)果:
The parameter passed from main function is zieckey 
pthread is created...


    例程總結(jié):
    可以看出來main函數(shù)中的字符串傳入了新建的線程中。

例程4:
    程序功能:向新建的線程傳遞字符串
        程序名稱:pthread_struct.c
/********************************************************************************************
**    Name:pthread_struct.c
**    Used to study the multithread programming in Linux OS
**    Pass a ‘char*‘ parameter to the thread.
**    Author:zeickey
**    Date:2006/9/16       
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

struct menber
{
    int a;
    char *s;
};

void *create(void *arg)
{
    struct menber *temp;
    temp=(struct menber *)arg;
    printf("menber->a = %d  \n",temp->a);
    printf("menber->s = %s  \n",temp->s);
    return (void *)0;
}

int main(int argc,char *argv[])
{
    pthread_t tidp;
    int error;
    struct menber *b;
    b=(struct menber *)malloc( sizeof(struct menber) );
    b->a = 4;
    b->s = "zieckey";

    error = pthread_create(&tidp, NULL, create, (void *)b);

    if( error )
    {
        printf("phread is not created...\n");
        return -1;
    }
    sleep(1);
    printf("pthread is created...\n");
    return 0;
}

  編譯方法:

gcc -Wall pthread_struct.c -lpthread


    執(zhí)行結(jié)果:
menber->a = 4 
menber->s = zieckey 
pthread is created...

    例程總結(jié):
    可以看出來main函數(shù)中的一個結(jié)構(gòu)體傳入了新建的線程中。
    線程包含了標識進程內(nèi)執(zhí)行環(huán)境必須的信息。他集成了進程中的所有信息都是對線程進行共享的,包括文本程序、程序的全局內(nèi)存和堆內(nèi)存、棧以及文件描述符。
   

例程5:
    程序目的:驗證新建立的線程可以共享進程中的數(shù)據(jù)
    程序名稱:pthread_share.c 

/********************************************************************************************
**    Name:pthread_share_data.c
**    Used to study the multithread programming in Linux OS
**    Pass a ‘char*‘ parameter to the thread.
**    Author:zeickey
**    Date:2006/9/16       
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

static int a=4;
void *create(void *arg)
{
    printf("new pthread ... \n");
    printf("a=%d  \n",a);
    return (void *)0;
}

int main(int argc,char *argv[])
{
    pthread_t tidp;
    int error;
   
    a=5;

    error=pthread_create(&tidp, NULL, create, NULL);

    if(error!=0)
    {
        printf("new thread is not create ... \n");
        return -1;
    }
   
    sleep(1);
   
    printf("new thread is created ... \n");
    return 0;
}
   
  編譯方法:

gcc -Wall pthread_share_data.c -lpthread


    執(zhí)行結(jié)果:
new pthread ...
a=5 
new thread is created ...


    例程總結(jié):
可以看出來,我們在主線程更改了我們的全局變量a的值的時候,我們新建立的線程則打印出來了改變的值,可以看出可以訪問線程所在進程中的數(shù)據(jù)信息。
2、線程的終止

    如果進程中任何一個線程中調(diào)用exit,_Exit,或者是_exit,那么整個進程就會終止,
    與此類似,如果信號的默認的動作是終止進程,那么,把該信號發(fā)送到線程會終止進程。
    線程的正常退出的方式:
       (1) 線程只是從啟動例程中返回,返回值是線程中的退出碼
       (2) 線程可以被另一個進程進行終止
       (3) 線程自己調(diào)用pthread_exit函數(shù)
    兩個重要的函數(shù)原型:

#include <pthread.h>
void pthread_exit(void *rval_ptr);
/*rval_ptr 線程退出返回的指針*/

int pthread_join(pthread_t thread,void **rval_ptr);
   /*成功結(jié)束進程為0,否則為錯誤編碼*/


    例程6
    程序目的:線程正常退出,接受線程退出的返回碼
    程序名稱:pthread_exit.c

/********************************************************************************************
**    Name:pthread_exit.c
**    Used to study the multithread programming in Linux OS
**    A example showing a thread to exit and with a return code.
**    Author:zeickey
**    Date:2006/9/16        
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *create(void *arg)
{
    printf("new thread is created ... \n");
    return (void *)8;
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int error;
    void *temp;

    error = pthread_create(&tid, NULL, create, NULL);

    if( error )
    {
        printf("thread is not created ... \n");
        return -1;
    }
    error = pthread_join(tid, &temp);

    if( error )
    {
        printf("thread is not exit ... \n");
        return -2;
    }
    
    printf("thread is exit code %d \n", (int )temp);
    return 0;
}

  編譯方法:

gcc -Wall pthread_exit.c -lpthread


    執(zhí)行結(jié)果:
new thread is created ...
thread is exit code 8

    例程總結(jié):
可以看出來,線程退出可以返回線程的int數(shù)值。線程退出不僅僅可以返回線程的int數(shù)值,還可以返回一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

    例程7
    程序目的:線程結(jié)束返回一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
    程序名稱:pthread_return_struct.c
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

struct menber
{
    int a;
    char *b;
}temp={8,"zieckey"};
void *create(void *arg)
{
    printf("new thread ... \n");
    return (void *)&temp;
}

int main(int argc,char *argv[])
{
    int error;
    pthread_t tid;
    struct menber *c;

    error = pthread_create(&tid, NULL, create, NULL);
   
    if( error )
    {
        printf("new thread is not created ... \n");
        return -1;
    }
    printf("main ... \n");

    error = pthread_join(tid,(void *)&c);

    if( error )
    {
        printf("new thread is not exit ... \n");
        return -2;
    }
    printf("c->a = %d  \n",c->a);
    printf("c->b = %s  \n",c->b);
    sleep(1);
    return 0;
}


  編譯方法:

gcc -Wall pthread_return_struct.c -lpthread


    執(zhí)行結(jié)果:

main ...
new thread ...
c->a = 8
c->b = zieckey


例程總結(jié):
一定要記得返回的數(shù)據(jù)結(jié)構(gòu)要是在這個數(shù)據(jù)要返回的結(jié)構(gòu)沒有釋放的時候應(yīng)用,
如果數(shù)據(jù)結(jié)構(gòu)已經(jīng)發(fā)生變化,那返回的就不會是我們所需要的,而是臟數(shù)據(jù)
3、線程標識

    函數(shù)原型:
   
#include <pthread.h>
pthread_t pthread_self(void);

pid_t getpid(void);
    getpid()用來取得目前進程的進程識別碼,函數(shù)說明

    例程8
    程序目的:實現(xiàn)在新建立的線程中打印該線程的id和進程id
    程序名稱:pthread_id.c
  
/********************************************************************************************
**    Name:pthread_id.c
**    Used to study the multithread programming in Linux OS.
**    Showing how to get the thread's tid and the process's pid.
**    Author:zeickey
**    Date:2006/9/16       
**    Copyright (c) 2006,All Rights Reserved!
*********************************************************************************************/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h> /*getpid()*/

void *create(void *arg)
{
    printf("New thread .... \n");
    printf("This thread's id is %u  \n", (unsigned int)pthread_self());
    printf("The process pid is %d  \n",getpid());
    return (void *)0;
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int error;

    printf("Main thread is starting ... \n");

    error = pthread_create(&tid, NULL, create, NULL);

    if(error)
    {
        printf("thread is not created ... \n");
        return -1;
    }
    printf("The main process's pid is %d  \n",getpid());
    sleep(1);
    return 0;
}


    編譯方法:

  
gcc -Wall -lpthread pthread_id.c

    執(zhí)行結(jié)果:

Main thread is starting ...
The main process's pid is 3307 
New thread ....
This thread's id is 3086347152 
The process pid is 3307 

posted on 2008-10-13 15:35 閱讀(3950) 評論(3)  編輯 收藏 引用 所屬分類: liunx編程技術(shù)

評論

# re: Linux下多線程編程詳解  回復(fù)  更多評論   

void* (start_rtn)(void) 返回值是void類型的指針函數(shù)

應(yīng)該是返回值是void*類型的函數(shù)指針吧
2013-06-03 22:13 | momognu

# re: Linux下多線程編程詳解  回復(fù)  更多評論   

void * (*start_rtn)(void) 返回值是void類型的函數(shù)指針
2013-06-03 22:28 | momognu

# re: Linux下多線程編程詳解  回復(fù)  更多評論   


void * (*start_rtn)(void *);
倒下了
2013-06-04 00:29 | momognu
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            91久久精品国产| 欧美成人日本| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲一区欧美| 欧美国产日产韩国视频| 久久综合图片| 国产欧美日韩一级| 一本在线高清不卡dvd| 妖精成人www高清在线观看| 久久亚洲春色中文字幕久久久| 欧美一区二区三区免费视频| 国产精品99免费看| 日韩亚洲一区二区| 亚洲视频在线观看一区| 欧美精品高清视频| 亚洲精品久久久久中文字幕欢迎你 | 久热re这里精品视频在线6| 久久国产一区二区| 国产日韩视频| 午夜精品亚洲| 久久精品最新地址| 国产一级揄自揄精品视频| 亚洲欧美视频在线观看视频| 亚洲欧美三级在线| 国产欧美一区二区三区另类精品 | 在线视频欧美一区| 99综合视频| 国产精品jvid在线观看蜜臀 | 久久天天躁狠狠躁夜夜av| 噜噜噜躁狠狠躁狠狠精品视频| 韩国一区二区三区美女美女秀| 性18欧美另类| 免播放器亚洲一区| 亚洲三级影院| 欧美日韩国产一区二区三区地区| 一区二区免费在线播放| 欧美一区二区三区四区高清| 狠狠狠色丁香婷婷综合激情| 久久综合给合| 亚洲第一区中文99精品| 日韩视频一区二区三区| 国产精品免费区二区三区观看| 亚洲永久精品大片| 久久夜色精品亚洲噜噜国产mv| 在线看日韩av| 欧美午夜激情视频| 欧美亚洲一区| 亚洲电影免费观看高清完整版| 在线综合亚洲| 国产在线国偷精品产拍免费yy| 久久综合狠狠| 亚洲天堂av综合网| 欧美在线视频二区| 国产视频一区二区三区在线观看| 久久精品二区亚洲w码| 激情久久久久久| 蜜臀91精品一区二区三区| 日韩亚洲欧美成人一区| 欧美在线免费看| 亚洲黄网站在线观看| 欧美日韩在线观看一区二区三区| 亚洲欧美网站| 日韩小视频在线观看专区| 欧美一级在线播放| 亚洲美女网站| 国语自产精品视频在线看抢先版结局 | 欧美大片免费观看| 亚洲主播在线| 亚洲精品护士| 国产一区自拍视频| 欧美日韩亚洲高清一区二区| 久久精品国产免费观看| 在线综合视频| 亚洲高清不卡av| 久久精品国产亚洲a| 一区二区三区国产精品| 在线看片成人| 国语精品一区| 国产精品青草久久久久福利99| 久热这里只精品99re8久| 亚洲欧美精品suv| 一区二区三区精密机械公司 | 亚洲国产综合91精品麻豆| 欧美在线观看网址综合| 日韩网站在线| 亚洲欧洲久久| 在线播放中文字幕一区| 国产一区二区三区久久久久久久久| 欧美日韩岛国| 欧美华人在线视频| 美女日韩在线中文字幕| 久久久久久噜噜噜久久久精品| 亚洲综合精品一区二区| 99在线观看免费视频精品观看| 亚洲国产精品va在线观看黑人| 美女啪啪无遮挡免费久久网站| 久久精品国产精品| 欧美一区二区在线| 欧美中文字幕不卡| 欧美影院成年免费版| 欧美一级一区| 欧美中文字幕| 久久久天天操| 理论片一区二区在线| 免费观看成人鲁鲁鲁鲁鲁视频| 久久色中文字幕| 久久综合九色欧美综合狠狠| 久久香蕉国产线看观看网| 久久免费精品视频| 免费久久99精品国产| 欧美成人一区二免费视频软件| 欧美a级片网| 亚洲国产激情| 日韩亚洲欧美在线观看| 中文国产成人精品| 亚洲欧美精品在线观看| 久久riav二区三区| 鲁鲁狠狠狠7777一区二区| 女主播福利一区| 欧美日韩一区在线观看视频| 国产精品第十页| 国产日韩欧美一区二区三区在线观看| 国产农村妇女精品一区二区| 国产在线乱码一区二区三区| 在线观看91精品国产入口| 亚洲久久一区| 亚洲欧美电影在线观看| 久久久久国产精品厨房| 欧美国产欧美综合 | 国内久久视频| 亚洲电影中文字幕| 宅男在线国产精品| 欧美伊人久久大香线蕉综合69| 老司机午夜精品视频在线观看| 亚洲国产综合在线看不卡| 亚洲私人影院| 麻豆av一区二区三区久久| 欧美日韩一区二区三区| 国产一区二区精品| 99re66热这里只有精品3直播| 午夜精品亚洲一区二区三区嫩草| 久久永久免费| 99re6这里只有精品视频在线观看| 欧美一级播放| 欧美日韩免费看| 一本色道久久综合| 欧美激情bt| 国产精品乱码一区二区三区 | 国产精品久久久久99| 国产精自产拍久久久久久| 精品不卡一区| 亚洲欧美日韩精品久久| 欧美成人日韩| 亚洲欧美日韩网| 欧美精品乱人伦久久久久久| 国产亚洲精品资源在线26u| 99伊人成综合| 久久只有精品| 亚洲在线观看免费| 欧美日韩精品久久| 亚洲国产午夜| 久久青青草综合| 国产精品99久久久久久久久久久久| 裸体歌舞表演一区二区| 国产欧美一区二区三区沐欲 | 午夜精品av| 欧美区一区二区三区| 性色av一区二区三区| 免费美女久久99| 亚洲欧美在线视频观看| 欧美日韩综合视频| 亚洲精品中文字幕女同| 久久噜噜噜精品国产亚洲综合| 99爱精品视频| 欧美日韩成人综合在线一区二区 | 嫩模写真一区二区三区三州| 国产日韩在线看片| 亚洲欧美日本国产专区一区| 一区二区三区亚洲| 久久九九国产精品怡红院| 亚洲综合社区| 国产免费观看久久黄| 亚洲欧美日韩在线播放| 一区二区三区四区精品| 欧美日韩免费观看一区三区| 一本久久a久久免费精品不卡| 亚洲国产精品久久久久婷婷老年| 久久久最新网址| 亚洲福利视频三区| 欧美高清在线精品一区| 欧美69wwwcom| 香蕉国产精品偷在线观看不卡| 日韩视频一区二区在线观看| 欧美另类99xxxxx| 一本到12不卡视频在线dvd| 亚洲精选视频免费看| 亚洲国产精品尤物yw在线观看| 免费观看不卡av| 亚洲日本成人网| 日韩写真在线|