• <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>
            franksunny的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專(zhuān)注與堅(jiān)持不懈多過(guò)天才與機(jī)會(huì)。 ——C.W. Wendte

            雖然自己用多線(xiàn)程編程用過(guò)一陣子,但是未曾仔細(xì)了解過(guò)概念,用的也是亂亂的,今天看到一篇線(xiàn)程總結(jié)的文章,感覺(jué)講的很好,Windows下的多線(xiàn)程也就是了解了線(xiàn)程的概念然后加一同步代碼就行了。

            Windows平臺(tái)下的多線(xiàn)程編程

            ?

            線(xiàn)程是進(jìn)程的一條執(zhí)行路徑,它包含獨(dú)立的堆棧和 CPU 寄存器狀態(tài),每個(gè)線(xiàn)程共享所有的進(jìn)程資源,包括打開(kāi)的文件、信號(hào)標(biāo)識(shí)及動(dòng)態(tài)分配的內(nèi)存等。一個(gè)進(jìn)程內(nèi)的所有線(xiàn)程使用同一個(gè)地址空間,而這些線(xiàn)程的執(zhí)行由系統(tǒng)調(diào)度程序控制,調(diào)度程序決定哪個(gè)線(xiàn)程可執(zhí)行以及什么時(shí)候執(zhí)行線(xiàn)程。線(xiàn)程有優(yōu)先級(jí)別,優(yōu)先權(quán)較低的線(xiàn)程必須等到優(yōu)先權(quán)較高的線(xiàn)程執(zhí)行完后再執(zhí)行。在多處理器的機(jī)器上,調(diào)度程序可將多個(gè)線(xiàn)程放到不同的處理器上去運(yùn)行,這樣可使處理器任務(wù)平衡,并提高系統(tǒng)的運(yùn)行效率。

            Windows 是一種多任務(wù)的操作系統(tǒng),在 Windows 的一個(gè)進(jìn)程內(nèi)包含一個(gè)或多個(gè)線(xiàn)程。 32 Windows 環(huán)境下的 Win32 API 提供了多線(xiàn)程應(yīng)用程序開(kāi)發(fā)所需要的接口函數(shù),而利用VC中提供的標(biāo)準(zhǔn)C庫(kù)也可以開(kāi)發(fā)多線(xiàn)程應(yīng)用程序,相應(yīng)的MFC類(lèi)庫(kù)封裝了多線(xiàn)程編程的類(lèi),用戶(hù)在開(kāi)發(fā)時(shí)可根據(jù)應(yīng)用程序的需要和特點(diǎn)選擇相應(yīng)的工具。為了使大家能全面地了解 Windows 多線(xiàn)程編程技術(shù),本文將重點(diǎn)介紹 Win32 API MFC 兩種方式下如何編制多線(xiàn)程程序。

            多線(xiàn)程編程在 Win32 方式下和 MFC 類(lèi)庫(kù)支持下的原理是一致的,進(jìn)程的主線(xiàn)程在任何需要的時(shí)候都可以創(chuàng)建新的線(xiàn)程。當(dāng)線(xiàn)程執(zhí)行完后,自動(dòng)終止線(xiàn)程 ; 當(dāng)進(jìn)程結(jié)束后,所有的線(xiàn)程都終止。所有活動(dòng)的線(xiàn)程共享進(jìn)程的資源,因此,在編程時(shí)需要考慮在多個(gè)線(xiàn)程訪問(wèn)同一資源時(shí)產(chǎn)生沖突的問(wèn)題。當(dāng)一個(gè)線(xiàn)程正在訪問(wèn)某進(jìn)程對(duì)象,而另一個(gè)線(xiàn)程要改變?cè)搶?duì)象,就可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果,編程時(shí)要解決這個(gè)沖突。

            ?

            Win32 API 下的多線(xiàn)程編程

            Win32 API Windows 操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的界面,它將內(nèi)核提供的功能進(jìn)行函數(shù)包裝,應(yīng)用程序通過(guò)調(diào)用相關(guān)函數(shù)而獲得相應(yīng)的系統(tǒng)功能。為了向應(yīng)用程序提供多線(xiàn)程功能, Win32 API 函數(shù)集中提供了一些處理多線(xiàn)程程序的函數(shù)集。直接用 Win32 API 進(jìn)行程序設(shè)計(jì)具有很多優(yōu)點(diǎn) : 基于 Win32 的應(yīng)用程序執(zhí)行代碼小,運(yùn)行效率高,但是它要求程序員編寫(xiě)的代碼較多,且需要管理所有系統(tǒng)提供給程序的資源。用 Win32 API 直接編寫(xiě)程序要求程序員對(duì) Windows 系統(tǒng)內(nèi)核有一定的了解,會(huì)占用程序員很多時(shí)間對(duì)系統(tǒng)資源進(jìn)行管理,因而程序員的工作效率降低。

            ?

            1. Win32 函數(shù)創(chuàng)建和終止線(xiàn)程

            Win32 函數(shù)庫(kù)中提供了操作多線(xiàn)程的函數(shù),包括創(chuàng)建線(xiàn)程、終止線(xiàn)程、建立互斥區(qū)等。在應(yīng)用程序的主線(xiàn)程或者其他活動(dòng)線(xiàn)程中創(chuàng)建新的線(xiàn)程的函數(shù)如下:

            HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);

            如果創(chuàng)建成功則返回線(xiàn)程的句柄,否則返回 NULL 。創(chuàng)建了新的線(xiàn)程后,該線(xiàn)程就開(kāi)始啟動(dòng)執(zhí)行了。但如果在 dwCreationFlags 中使用了 CREATE_SUSPENDED 特性,那么線(xiàn)程并不馬上執(zhí)行,而是先掛起,等到調(diào)用 ResumeThread 后才開(kāi)始啟動(dòng)線(xiàn)程,在這個(gè)過(guò)程中可以調(diào)用下面這個(gè)函數(shù)來(lái)設(shè)置線(xiàn)程的優(yōu)先權(quán):

            BOOL SetThreadPriority(HANDLE hThread,int nPriority);

            當(dāng)調(diào)用線(xiàn)程的函數(shù)返回后,線(xiàn)程自動(dòng)終止。如果需要在線(xiàn)程的執(zhí)行過(guò)程中終止則可調(diào)用函數(shù):

            VOID ExitThread(DWORD dwExitCode);

            如果在線(xiàn)程的外面終止線(xiàn)程,則可調(diào)用下面的函數(shù):

            BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

            但應(yīng)注意 : 該函數(shù)可能會(huì)引起系統(tǒng)不穩(wěn)定,而且線(xiàn)程所占用的資源也不釋放。因此,一般情況下,建議不要使用該函數(shù)。

            如果要終止的線(xiàn)程是進(jìn)程內(nèi)的最后一個(gè)線(xiàn)程,則線(xiàn)程被終止后相應(yīng)的進(jìn)程也應(yīng)終止。

            ?

            2. 線(xiàn)程的同步

            在線(xiàn)程體內(nèi),如果該線(xiàn)程完全獨(dú)立,與其他線(xiàn)程沒(méi)有數(shù)據(jù)存取等資源操作上的沖突,則可按照通常單線(xiàn)程的方法進(jìn)行編程。但是,在多線(xiàn)程處理時(shí)情況常常不是這樣,線(xiàn)程之間經(jīng)常要同時(shí)訪問(wèn)一些資源。由于對(duì)共享資源進(jìn)行訪問(wèn)引起沖突是不可避免的,為了解決這種線(xiàn)程同步問(wèn)題, Win32 API 提供了多種同步控制對(duì)象來(lái)幫助程序員解決共享資源訪問(wèn)沖突。在介紹這些同步對(duì)象之前先介紹一下等待函數(shù),因?yàn)樗锌刂茖?duì)象的訪問(wèn)控制都要用到這個(gè)函數(shù)。

            Win32 API 提供了一組能使線(xiàn)程阻塞其自身執(zhí)行的等待函數(shù)。這些函數(shù)在其參數(shù)中的一個(gè)或多個(gè)同步對(duì)象產(chǎn)生了信號(hào),或者超過(guò)規(guī)定的等待時(shí)間才會(huì)返回。在等待函數(shù)未返回時(shí),線(xiàn)程處于等待狀態(tài),此時(shí)線(xiàn)程只消耗很少的 CPU 時(shí)間。使用等待函數(shù)既可以保證線(xiàn)程的同步,又可以提高程序的運(yùn)行效率。最常用的等待函數(shù)是:

            DWORD WaitForSingleObject(HANDLE hHandle DWORD dwMilliseconds);

            而函數(shù) WaitForMultipleObject 可以用來(lái)同時(shí)監(jiān)測(cè)多個(gè)同步對(duì)象,該函數(shù)的聲明為:

            DWORD WaitForMultipleObject(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);

            1 )互斥體對(duì)象

            Mutex 對(duì)象的狀態(tài)在它不被任何線(xiàn)程擁有時(shí)才有信號(hào),而當(dāng)它被擁有時(shí)則無(wú)信號(hào)。 Mutex 對(duì)象很適合用來(lái)協(xié)調(diào)多個(gè)線(xiàn)程對(duì)共享資源的互斥訪問(wèn)。可按下列步驟使用該對(duì)象:

            首先,建立互斥體對(duì)象,得到句柄:

            HANDLE CreateMutex();

            然后,在線(xiàn)程可能產(chǎn)生沖突的區(qū)域前(即訪問(wèn)共享資源之前)調(diào)用 WaitForSingleObject ,將句柄傳給函數(shù),請(qǐng)求占用互斥對(duì)象:

            dwWaitResult = WaitForSingleObject(hMutex,5000L);

            共享資源訪問(wèn)結(jié)束,釋放對(duì)互斥體對(duì)象的占用:

            ReleaseMutex(hMutex);

            互斥體對(duì)象在同一時(shí)刻只能被一個(gè)線(xiàn)程占用,當(dāng)互斥體對(duì)象被一個(gè)線(xiàn)程占用時(shí),若有另一線(xiàn)程想占用它,則必須等到前一線(xiàn)程釋放后才能成功。

            ?

            2 )信號(hào)對(duì)象

            信號(hào)對(duì)象允許同時(shí)對(duì)多個(gè)線(xiàn)程共享資源進(jìn)行訪問(wèn),在創(chuàng)建對(duì)象時(shí)指定最大可同時(shí)訪問(wèn)的線(xiàn)程數(shù)。當(dāng)一個(gè)線(xiàn)程申請(qǐng)?jiān)L問(wèn)成功后,信號(hào)對(duì)象中的計(jì)數(shù)器減一,調(diào)用 ReleaseSemaphore 函數(shù)后,信號(hào)對(duì)象中的計(jì)數(shù)器加一。其中,計(jì)數(shù)器值大于或等于0,但小于或等于創(chuàng)建時(shí)指定的最大值。如果一個(gè)應(yīng)用在創(chuàng)建一個(gè)信號(hào)對(duì)象時(shí),將其計(jì)數(shù)器的初始值設(shè)為0,就阻塞了其他線(xiàn)程,保護(hù)了資源。等初始化完成后,調(diào)用 ReleaseSemaphore 函數(shù)將其計(jì)數(shù)器增加至最大值,則可進(jìn)行正常的存取訪問(wèn)。可按下列步驟使用該對(duì)象:

            首先,創(chuàng)建信號(hào)對(duì)象:

            HANDLE CreateSemaphore();

            或者打開(kāi)一個(gè)信號(hào)對(duì)象:

            HANDLE OpenSemaphore();

            然后,在線(xiàn)程訪問(wèn)共享資源之前調(diào)用 WaitForSingleObject

            共享資源訪問(wèn)完成后,應(yīng)釋放對(duì)信號(hào)對(duì)象的占用:

            ReleaseSemaphore();

            3 )事件對(duì)象

            事件對(duì)象 (Event) 是最簡(jiǎn)單的同步對(duì)象,它包括有信號(hào)和無(wú)信號(hào)兩種狀態(tài)。在線(xiàn)程訪問(wèn)某一資源之前,需要等待某一事件的發(fā)生,這時(shí)用事件對(duì)象最合適。例如:只有在通信端口緩沖區(qū)收到數(shù)據(jù)后,監(jiān)視線(xiàn)程才被激活。

            事件對(duì)象是用 CreateEvent 函數(shù)建立的。該函數(shù)可以指定事件對(duì)象的類(lèi)和事件的初始狀態(tài)。如果是手工重置事件,那么它總是保持有信號(hào)狀態(tài),直到用 ResetEvent 函數(shù)重置成無(wú)信號(hào)的事件。如果是自動(dòng)重置事件,那么它的狀態(tài)在單個(gè)等待線(xiàn)程釋放后會(huì)自動(dòng)變?yōu)闊o(wú)信號(hào)的。用 SetEvent 可以把事件對(duì)象設(shè)置成有信號(hào)狀態(tài)。在建立事件時(shí),可以為對(duì)象命名,這樣其他進(jìn)程中的線(xiàn)程可以用 OpenEvent 函數(shù)打開(kāi)指定名字的事件對(duì)象句柄。

            4 )排斥區(qū)對(duì)象

            在排斥區(qū)中異步執(zhí)行時(shí),它只能在同一進(jìn)程的線(xiàn)程之間共享資源處理。雖然此時(shí)上面介紹的幾種方法均可使用,但是,使用排斥區(qū)的方法則使同步管理的效率更高。

            使用時(shí)先定義一個(gè) CR99vICAL_SECTION 結(jié)構(gòu)的排斥區(qū)對(duì)象,在進(jìn)程使用之前調(diào)用如下函數(shù)對(duì)對(duì)象進(jìn)行初始化 :

            VOID InitializeCriticalSection( LPCRITICAL_SECTION );

            當(dāng)一個(gè)線(xiàn)程使用排斥區(qū)時(shí),調(diào)用函數(shù): EnterCriticalSection 或者 TryEnterCriticalSection;

            當(dāng)要求占用、退出排斥區(qū)時(shí),調(diào)用函數(shù) LeaveCriticalSection ,釋放對(duì)排斥區(qū)對(duì)象的占用,供其他線(xiàn)程使用。

            ?

            基于MFC的多線(xiàn)程編程

            ?

            MFC 是微軟的 VC 開(kāi)發(fā)集成環(huán)境中提供給程序員的基礎(chǔ)函數(shù)庫(kù),它用類(lèi)庫(kù)的方式將 Win32 API 進(jìn)行封裝,以類(lèi)的方式提供給開(kāi)發(fā)者。由于其快速、簡(jiǎn)捷、功能強(qiáng)大等特點(diǎn)深受廣大開(kāi)發(fā)者喜愛(ài)。因此,建議使用 MFC 類(lèi)庫(kù)進(jìn)行應(yīng)用程序的開(kāi)發(fā)。

            VC++ 附帶的 MFC 類(lèi)庫(kù)中,提供了對(duì)多線(xiàn)程編程的支持,基本原理與基于 Win32 API 的設(shè)計(jì)一致,但由于 MFC 對(duì)同步對(duì)象做了封裝,因此實(shí)現(xiàn)起來(lái)更加方便,避免了對(duì)象句柄管理上的煩瑣工作。

            MFC 中,線(xiàn)程分為兩種:工作線(xiàn)程和用戶(hù)接口線(xiàn)程。工作線(xiàn)程與前面所述的線(xiàn)程一致,用戶(hù)接口線(xiàn)程是一種能夠接收用戶(hù)的輸入、處理事件和消息的線(xiàn)程。

            1. 工作線(xiàn)程

            工作線(xiàn)程編程較為簡(jiǎn)單,設(shè)計(jì)思路與前面所講的基本一致 : 一個(gè)基本函數(shù)代表了一個(gè)線(xiàn)程,創(chuàng)建并啟動(dòng)線(xiàn)程后,線(xiàn)程進(jìn)入運(yùn)行狀態(tài) ; 如果線(xiàn)程用到共享資源,則需要進(jìn)行資源同步處理。這種方式創(chuàng)建線(xiàn)程并啟動(dòng)線(xiàn)程時(shí)可調(diào)用函數(shù):

            CWinThread*AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority= THREAD_PRIOR ITY _NORMAL,UINT nStackSize =0,DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

            參數(shù) pfnThreadProc 是線(xiàn)程執(zhí)行體函數(shù),函數(shù)原形為 : UINT ThreadFunction( LPVOID pParam)

            參數(shù) pParam 是傳遞給執(zhí)行函數(shù)的參數(shù);

            參數(shù) nPriority 是線(xiàn)程執(zhí)行權(quán)限,可選值:

            THREAD_PRIOR ITY _NORMAL THREAD_PRIOR ITY _LOWEST THREAD_PRIOR ITY _HIGHEST THREAD_PRIOR ITY _IDLE

            參數(shù) dwCreateFlags 是線(xiàn)程創(chuàng)建時(shí)的標(biāo)志,可取值 CREATE_SUSPENDED ,表示線(xiàn)程創(chuàng)建后處于掛起狀態(tài),調(diào)用 ResumeThread 函數(shù)后線(xiàn)程繼續(xù)運(yùn)行,或者取值 0” 表示線(xiàn)程創(chuàng)建后處于運(yùn)行狀態(tài)。

            返回值是 CWinThread 類(lèi)對(duì)象指針,它的成員變量 m_hThread 為線(xiàn)程句柄,在 Win32 API 方式下對(duì)線(xiàn)程操作的函數(shù)參數(shù)都要求提供線(xiàn)程的句柄,所以當(dāng)線(xiàn)程創(chuàng)建后可以使用所有 Win32 API 函數(shù)對(duì) pWinThread->m_Thread 線(xiàn)程進(jìn)行相關(guān)操作。

            ?

            注意:如果在一個(gè)類(lèi)對(duì)象中創(chuàng)建和啟動(dòng)線(xiàn)程時(shí),應(yīng)將線(xiàn)程函數(shù)定義成類(lèi)外的全局函數(shù)。 (這句話(huà)是否必要,我也不清楚)

            ?

            2. 用戶(hù)接口線(xiàn)程

            基于 MFC 的應(yīng)用程序有一個(gè)應(yīng)用對(duì)象,它是 CWinApp 派生類(lèi)的對(duì)象,該對(duì)象代表了應(yīng)用進(jìn)程的主線(xiàn)程。當(dāng)線(xiàn)程執(zhí)行完并退出線(xiàn)程時(shí),由于進(jìn)程中沒(méi)有其他線(xiàn)程存在,進(jìn)程自動(dòng)結(jié)束。類(lèi) C inApp C inThread 派生出來(lái), C inThread 是用戶(hù)接口線(xiàn)程的基本類(lèi)。我們?cè)诰帉?xiě)用戶(hù)接口線(xiàn)程時(shí),需要從 C inThread 派生我們自己的線(xiàn)程類(lèi), ClassWizard 可以幫助我們完成這個(gè)工作。

            先用 ClassWizard 派生一個(gè)新的類(lèi),設(shè)置基類(lèi)為 CwinThread 。注意:類(lèi)的 DECLARE_DYNCREATE IMPLEMENT_DYNCREATE 宏是必需的,因?yàn)閯?chuàng)建線(xiàn)程時(shí)需要?jiǎng)討B(tài)創(chuàng)建類(lèi)的對(duì)象。根據(jù)需要可將初始化和結(jié)束代碼分別放在類(lèi)的 InitInstance ExitInstance 函數(shù)中。如果需要?jiǎng)?chuàng)建窗口,則可在 InitInstance 函數(shù)中完成。然后創(chuàng)建線(xiàn)程并啟動(dòng)線(xiàn)程。可以用兩種方法來(lái)創(chuàng)建用戶(hù)接口線(xiàn)程, MFC 提供了兩個(gè)版本的 AfxBeginThread 函數(shù),其中一個(gè)用于創(chuàng)建用戶(hù)接口線(xiàn)程。第二種方法分為兩步進(jìn)行:首先,調(diào)用線(xiàn)程類(lèi)的構(gòu)造函數(shù)創(chuàng)建一個(gè)線(xiàn)程對(duì)象;其次,調(diào)用 CWinThread::CreateThread 函數(shù)來(lái)創(chuàng)建該線(xiàn)程。線(xiàn)程建立并啟動(dòng)后,在線(xiàn)程函數(shù)執(zhí)行過(guò)程中一直有效。如果是線(xiàn)程對(duì)象,則在對(duì)象刪除之前,先結(jié)束線(xiàn)程。 CWinThread 已經(jīng)為我們完成了線(xiàn)程結(jié)束的工作。

            ?

            3. 線(xiàn)程同步

            前面我們介紹了 Win32 API 提供的幾種有關(guān)線(xiàn)程同步的對(duì)象,在 MFC 類(lèi)庫(kù)中對(duì)這幾個(gè)對(duì)象進(jìn)行了類(lèi)封裝,它們有一個(gè)共同的基類(lèi) CSyncObject ,它們的對(duì)應(yīng)關(guān)系為 : Semaphore 對(duì)應(yīng) CSemaphore Mutex 對(duì)應(yīng) CMutex Event 對(duì)應(yīng) CEvent CriticalSection 對(duì)應(yīng) CCriticalSection 。另外, MFC 對(duì)兩個(gè)等待函數(shù)也進(jìn)行了封裝,即 CSingleLock CMultiLock 。因四個(gè)對(duì)象用法相似,在這里就以 CMutex 為例進(jìn)行說(shuō)明:

            創(chuàng)建一個(gè) CMutex 對(duì)象 :

            CMutex mutex(FALSE,NULL,NULL); CMutex mutex;

            當(dāng)各線(xiàn)程要訪問(wèn)共享資源時(shí)使用下面代碼:

            CSingleLock sl(&mutex);

            sl.Lock();

            if(sl.IsLocked())

            // 對(duì)共享資源進(jìn)行操作 ...

            sl.Unlock();

            ?

            結(jié)束語(yǔ)

            如果用戶(hù)的應(yīng)用程序需要多個(gè)任務(wù)同時(shí)進(jìn)行相應(yīng)的處理,則使用多線(xiàn)程是較理想的選擇。這里,提醒大家注意的是在多線(xiàn)程編程時(shí)要特別小心處理資源共享問(wèn)題以及多線(xiàn)程調(diào)試問(wèn)題。筆者準(zhǔn)備了幾個(gè)實(shí)例,如大家需要的話(huà),可以和筆者聯(lián)系。

            posted on 2007-01-26 22:10 frank.sunny 閱讀(2542) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): MFC相關(guān)技術(shù)

            常用鏈接

            留言簿(13)

            隨筆分類(lèi)

            個(gè)人其它博客

            基礎(chǔ)知識(shí)鏈接

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产99精品久久| 99久久精品免费看国产一区二区三区 | 丰满少妇高潮惨叫久久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久精品aⅴ无码中文字字幕重口| 久久99精品免费一区二区| 久久美女人爽女人爽| 一级做a爰片久久毛片人呢| 久久精品嫩草影院| A级毛片无码久久精品免费| 996久久国产精品线观看| 久久婷婷国产麻豆91天堂| 伊人色综合久久天天| 久久se精品一区二区影院 | 精品久久香蕉国产线看观看亚洲| 亚洲精品无码专区久久久 | 国产激情久久久久久熟女老人| 99久久国产精品免费一区二区| 精品久久久无码21p发布| 久久婷婷五月综合97色| 亚洲精品国产成人99久久| 久久伊人五月天论坛| 久久久久久午夜成人影院| 欧美国产成人久久精品| 国内精品久久久久影院亚洲| 2021最新久久久视精品爱| 久久精品亚洲精品国产色婷| 久久精品视频网| 女同久久| 韩国三级大全久久网站| 一级A毛片免费观看久久精品| 亚洲中文久久精品无码| 99久久精品国产一区二区| 伊色综合久久之综合久久| 亚洲精品国精品久久99热一| 91精品国产高清久久久久久91| 一本久道久久综合狠狠躁AV| 国产精品久久一区二区三区| 久久国内免费视频| 久久99精品久久久久久齐齐| 蜜臀av性久久久久蜜臀aⅴ麻豆|