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

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

Linux下多線(xiàn)程編程詳解

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

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

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

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

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

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

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

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

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

  下面我們先來(lái)嘗試編寫(xiě)一個(gè)簡(jiǎn)單的多線(xiàn)程程序。

  簡(jiǎn)單的多線(xiàn)程編程

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


一個(gè)重要的線(xiàn)程創(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);

    返回值:若是成功建立線(xiàn)程返回0,否則返回錯(cuò)誤的編號(hào)
    形式參數(shù):
                pthread_t *restrict tidp 要?jiǎng)?chuàng)建的線(xiàn)程的線(xiàn)程id指針
                const pthread_attr_t *restrict attr 創(chuàng)建線(xiàn)程時(shí)的線(xiàn)程屬性
                void* (start_rtn)(void) 返回值是void類(lèi)型的指針函數(shù)
                void *restrict arg   start_rtn的行參
                
例程1:                               
    功能:創(chuàng)建一個(gè)簡(jiǎn)單的線(xiàn)程
    程序名稱(chē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

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

  運(yùn)行,我們得到如下結(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.
....

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


例程2:
    功能:向新的線(xiàn)程傳遞整形值
    程序名稱(chēng):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é):
    可以看出來(lái),我們?cè)趍ain函數(shù)中傳遞的整行指針,傳遞到我們新建的線(xiàn)程函數(shù)中。
    在上面的例子可以看出來(lái)我們向新的線(xiàn)程傳入了另一個(gè)線(xiàn)程的int數(shù)據(jù),線(xiàn)程之間還可以傳遞字符串或是更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
例程3:
    程序功能:向新建的線(xiàn)程傳遞字符串
        程序名稱(chēng):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é):
    可以看出來(lái)main函數(shù)中的字符串傳入了新建的線(xiàn)程中。

例程4:
    程序功能:向新建的線(xiàn)程傳遞字符串
        程序名稱(chēng):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é):
    可以看出來(lái)main函數(shù)中的一個(gè)結(jié)構(gòu)體傳入了新建的線(xiàn)程中。
    線(xiàn)程包含了標(biāo)識(shí)進(jìn)程內(nèi)執(zhí)行環(huán)境必須的信息。他集成了進(jìn)程中的所有信息都是對(duì)線(xiàn)程進(jìn)行共享的,包括文本程序、程序的全局內(nèi)存和堆內(nèi)存、棧以及文件描述符。
   

例程5:
    程序目的:驗(yàn)證新建立的線(xiàn)程可以共享進(jìn)程中的數(shù)據(jù)
    程序名稱(chēng):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é):
可以看出來(lái),我們?cè)谥骶€(xiàn)程更改了我們的全局變量a的值的時(shí)候,我們新建立的線(xiàn)程則打印出來(lái)了改變的值,可以看出可以訪(fǎng)問(wèn)線(xiàn)程所在進(jìn)程中的數(shù)據(jù)信息。
2、線(xiàn)程的終止

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

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

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


    例程6
    程序目的:線(xiàn)程正常退出,接受線(xiàn)程退出的返回碼
    程序名稱(chēng):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é):
可以看出來(lái),線(xiàn)程退出可以返回線(xiàn)程的int數(shù)值。線(xiàn)程退出不僅僅可以返回線(xiàn)程的int數(shù)值,還可以返回一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

    例程7
    程序目的:線(xiàn)程結(jié)束返回一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
    程序名稱(chēng):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)要是在這個(gè)數(shù)據(jù)要返回的結(jié)構(gòu)沒(méi)有釋放的時(shí)候應(yīng)用,
如果數(shù)據(jù)結(jié)構(gòu)已經(jīng)發(fā)生變化,那返回的就不會(huì)是我們所需要的,而是臟數(shù)據(jù)
3、線(xiàn)程標(biāo)識(shí)

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

pid_t getpid(void);
    getpid()用來(lái)取得目前進(jìn)程的進(jìn)程識(shí)別碼,函數(shù)說(shuō)明

    例程8
    程序目的:實(shí)現(xiàn)在新建立的線(xiàn)程中打印該線(xiàn)程的id和進(jìn)程id
    程序名稱(chēng):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) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): liunx編程技術(shù)

評(píng)論

# re: Linux下多線(xiàn)程編程詳解  回復(fù)  更多評(píng)論   

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

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

# re: Linux下多線(xiàn)程編程詳解  回復(fù)  更多評(píng)論   

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

# re: Linux下多線(xiàn)程編程詳解  回復(fù)  更多評(píng)論   


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| 亚洲精品视频一区二区三区| 欧美日韩精品免费看| 午夜伦理片一区| 亚洲高清自拍| 欧美一区二区三区免费观看| 1769国产精品| 国产精品高潮呻吟| 久久中文字幕导航| 一本久久综合亚洲鲁鲁| 久久精品日产第一区二区| 亚洲激情视频网站| 国产精品一卡| 欧美国产亚洲精品久久久8v| 亚洲一区在线免费观看| 欧美超级免费视 在线| 亚洲午夜黄色| 亚洲福利视频在线| 国产精品久久久久久av下载红粉 | 亚洲精品小视频在线观看| 欧美私人网站| 久久精品亚洲一区| 一级成人国产| 欧美国产国产综合| 欧美亚洲在线播放| 亚洲精品少妇网址| 国外视频精品毛片| 欧美午夜一区二区三区免费大片| 久久久www免费人成黑人精品| 日韩一级视频免费观看在线| 蜜桃av久久久亚洲精品| 亚洲免费视频网站| 亚洲精品视频在线| 尤物九九久久国产精品的分类| 欧美日一区二区在线观看 | 国产麻豆精品视频| 欧美日韩三级视频| 男人的天堂亚洲| 久久国产66| 亚洲女性裸体视频| 一本色道久久综合亚洲精品高清| 欧美成人精品福利| 久久久噜久噜久久综合| 欧美一区二区视频在线观看2020 | 男同欧美伦乱| 久久激情综合| 午夜伦理片一区| 一区二区三区国产| 亚洲免费观看视频| 亚洲日本va午夜在线影院| 国产一区二区三区高清播放| 国产精品视频内| 国产精品成人观看视频国产奇米| 免费观看在线综合色| 久久免费少妇高潮久久精品99| 性感少妇一区| 欧美一区视频在线| 久久国产精品72免费观看| 性色av一区二区三区| 亚洲欧美日韩成人高清在线一区| 在线视频你懂得一区| 一区电影在线观看| 亚洲视频在线一区| 亚洲综合久久久久| 亚洲欧美一级二级三级| 欧美一级夜夜爽| 久久精品一区四区| 裸体丰满少妇做受久久99精品| 久久亚洲午夜电影| 理论片一区二区在线| 男男成人高潮片免费网站| 免费在线国产精品| 欧美噜噜久久久xxx| 欧美色综合网| 国产情侣一区| 国产亚洲成av人在线观看导航| 国产一区av在线| 亚洲丁香婷深爱综合| 亚洲精品一级| 亚洲一区二区网站| 久久精品72免费观看| 免费av成人在线| 91久久黄色| 亚洲一区二区网站| 久久爱www| 欧美高清不卡| 国产精品久久久一本精品| 国产午夜亚洲精品不卡| 亚洲国产99| 中文一区二区在线观看| 欧美一区观看| 欧美国产一区二区三区激情无套| 亚洲三级毛片| 性伦欧美刺激片在线观看| 久久久久免费| 欧美日一区二区三区在线观看国产免| 国产精品―色哟哟| 在线免费不卡视频| 亚洲一区精品视频| 老司机精品福利视频| 亚洲国产清纯| 亚洲欧美日韩国产一区| 榴莲视频成人在线观看| 国产精品久久久久毛片大屁完整版 | 国产精品中文字幕欧美| 精品成人久久| 亚洲午夜影视影院在线观看| 久久久xxx| 99精品国产99久久久久久福利| 欧美一区二区黄| 欧美日韩免费一区| 影音先锋另类| 午夜免费日韩视频| 亚洲第一页自拍| 欧美影院成人| 欧美性大战xxxxx久久久| 一区二区视频欧美| 欧美一级淫片aaaaaaa视频| 亚洲二区在线观看| 久久精品国产2020观看福利| 欧美午夜免费电影| 亚洲韩国一区二区三区| 久久精品人人做人人爽电影蜜月| 亚洲日本成人女熟在线观看| 久久久美女艺术照精彩视频福利播放| 欧美视频在线不卡| 亚洲人体大胆视频| 免费成人高清在线视频| 亚洲综合社区| 国产精品wwwwww| 日韩一区二区电影网| 欧美刺激性大交免费视频| 欧美一级午夜免费电影| 国产精品美女诱惑| 亚洲午夜一区二区| 亚洲日本视频| 欧美激情一区二区三区不卡| 影音欧美亚洲| 久久人人爽人人爽| 欧美一区二区在线免费播放| 国产精品素人视频| 午夜精品一区二区三区在线视| 亚洲日韩成人| 欧美日韩国产三区| 日韩午夜黄色| 亚洲精品中文字幕有码专区| 欧美顶级艳妇交换群宴| 亚洲国产精品黑人久久久| 麻豆精品精品国产自在97香蕉| 午夜免费在线观看精品视频| 国产精品亚洲一区| 欧美伊人久久| 欧美在线免费一级片| 国产一区二区av| 久久久久久午夜| 久久精品日韩| 亚洲电影自拍| 亚洲经典一区| 欧美日本不卡视频| 亚洲一区二区三区免费在线观看| 日韩亚洲欧美成人一区| 欧美系列精品| 欧美在现视频| 久久久久久久久久久久久9999| 激情文学综合丁香| 欧美黄色影院| 欧美理论在线播放| 亚洲男人的天堂在线| 午夜精品一区二区在线观看 | 麻豆成人在线| 99热这里只有精品8| 999在线观看精品免费不卡网站| 欧美美女操人视频| 亚洲欧美激情一区| 欧美亚洲免费电影| 亚洲高清久久| 夜夜爽夜夜爽精品视频| 国产农村妇女毛片精品久久麻豆| 久久理论片午夜琪琪电影网| 美女视频一区免费观看| 中文国产亚洲喷潮| 午夜一级久久| 亚洲区中文字幕| 亚洲视频一区在线| 伊人色综合久久天天| 亚洲精品视频啊美女在线直播| 国产精品欧美经典| 蘑菇福利视频一区播放| 欧美午夜片在线观看| 久久综合五月| 欧美色一级片| 欧美不卡视频一区| 国产精品久久久久久久免费软件 |