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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

建立異步操作組件:隊(duì)列和線程

6.25.2008

Kevin Lynx

引言

在一個高效的系統(tǒng)中,我們經(jīng)常會將一些費(fèi)時的操作轉(zhuǎn)換為異步操作。例如往數(shù)據(jù)庫中寫日志。如果數(shù)據(jù)庫
配置在網(wǎng)絡(luò)上,那么往數(shù)據(jù)庫中插入一些日志信息將非常慢(相對于程序其他部分)。

如何轉(zhuǎn)換為異步?

將類似于以上過程轉(zhuǎn)換為異步操作,一個典型的做法是:建立一個單獨(dú)的數(shù)據(jù)庫日志線程,一個線程安全的
隊(duì)列。要寫日志時,只需要往隊(duì)列里放入數(shù)據(jù),數(shù)據(jù)庫日志線程則從這個隊(duì)列里取數(shù)據(jù)然后完成寫操作。

大致的過程類似于:

typedef safe_list<std::string> SafeList;
SafeList gLogList; 

// database thread.read log string.
unsigned int __stdcall DBThread( void *p )
{
    
whiletrue )
    
{
        
// read gLogList and write log string into the database
    }
 

    _endthreadex( 
0 );
    
return 0;
}
 

// other threads. write log string.
void wrtie_log( const std::string &log )
{
    gLogList.push_back( log );
}
 


將他們包裝起來

我們很有可能會在同一個系統(tǒng)中多次遇到類似需要轉(zhuǎn)換為異步操作的地方,如果每一次都手動去創(chuàng)建一個隊(duì)列和一
個線程,那將會多么乏味??!懶惰的程序員喜歡重用各種代碼。所以,我自己覺得很有必要將這一切封裝起來。我
們只需要封裝這個隊(duì)列和創(chuàng)建線程的繁瑣細(xì)節(jié),讓應(yīng)用層全部專注于具體的邏輯處理:

template <typename _NodeType>
class async_operator
{
public:
    
/// the list node type.
    typedef _NodeType node_type;
    
/// the list.
    typedef multi_list<node_type, Mutex, Semaphore> list_type;
    
/// operator signature
    typedef functor<void, TYPE_LIST1( list_type& )> operator_type;
    
/// init function signature, called when the thread starts.
    typedef functor<void> init_type;
    
/// called before the thread exits.
    typedef functor<void> release_type; 

public:
    
///
    
/// start the thread and execute the operation.
    
/// @param op the callback function operate the list node.
    
/// 

    void execute( operator_type &op, init_type &init = init_type(), release_type &release = release_type() ); 

    
///
    
/// exit the thread.It will block until the thread exited.
    
///

    void exit(); 

    
///
    
/// get the list so that you can pust list nodes.
    
///

    list_type &list(); 

private:
    list_type _list;
    operator_type _operator;
    init_type _init;
    release_type _release;
    thread _thread;
}



我利用了已有的組件:線程安全的容器multi_list、包裝任意執(zhí)行體的functor、線程維護(hù)類thread。那么,現(xiàn)在,
應(yīng)用層只需要定義隊(duì)列節(jié)點(diǎn)類型,寫應(yīng)用相關(guān)的回調(diào)函數(shù)(任意可被functor包裝的廣義函數(shù))。(見附件例子)

之所以為這個組件加上init和release,是因?yàn)橛行〇|西(例如COM)需要在線程啟動時初始化,而在線程快結(jié)束時釋放,例如對于
使用COM的應(yīng)用來說,就需要在線程初始化時CoInitialize,結(jié)束時CoUninitialize。

閑說下其他東西

在本文的附件代碼里,你可以獲取到functor、thread、multi_list這些東西,所以我有必要提一下。

關(guān)于functor,你可以參看<實(shí)現(xiàn)functor - 增強(qiáng)型的函數(shù)指針>,基本上可以看成增強(qiáng)版的C回調(diào)函數(shù);至于multi_list,基本上
是一個container adapter (套用下STL的概念),使用條件變量參與線程同步,據(jù)說效率要比簡單的互斥高點(diǎn);至于thread,我需要
特別說下:

thread最為重要的就是為其附加了一個windows的消息隊(duì)列(只要調(diào)用PeekMessage之類的函數(shù)該隊(duì)列就存在),本意是可以讓其他線
程傳送數(shù)據(jù)到該線程,但是目前只用于線程退出,即其他線程可以在任何時候要求該線程安全地退出(該線程沒有阻塞的情況下,
阻塞時獲取不到消息)。我不知道這個安全退出策略是否真的有必要存在,但是我討厭看到各種撇腳的退出方法(例如設(shè)置全局標(biāo)志
變量,增加額外的--沒封裝前---event對象之類)。

結(jié)束

不知道其他人是如何做這種異步轉(zhuǎn)換操作的,在這里我只是起個拋磚引玉的作用,歡迎大家提出意見。

 

例子下載

posted on 2008-06-25 15:47 Kevin Lynx 閱讀(5092) 評論(29)  編輯 收藏 引用 所屬分類: 通用編程

評論

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-25 16:13 true

既然允許阻塞時不能退出,為什么不能設(shè)全局變量呢?他更及時,不用參與排隊(duì),當(dāng)前日志寫完后,就可以退出了,當(dāng)然你要考慮日志是否要保存。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程[未登錄] 2008-06-25 16:22 Kevin Lynx

@true
貌似你誤解我意思了;)

’阻塞時不能退出‘:
例如線程里 WaitFor...INFINITE了,那么它就無法處理消息,也無法判斷退出標(biāo)志變量,代碼卡在這里了。

’他更及時,不用參與排隊(duì)‘:
這個跟上面不是說的同一個問題,隊(duì)列是用于實(shí)際業(yè)務(wù)處理,例如寫日志,上面那個說的是線程。

  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-25 16:39 true

一般這么搞,日志線程退出的及時:WaitFor。。。設(shè)個timeout,返回后,一是檢查是否超時,二檢查全局變量。除非在代碼結(jié)束階段,否則還是少用infinite。這種用法,用個模式的術(shù)語就是Active Object(感覺這個概念提出的很強(qiáng),思路清晰)  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-25 18:49 飯中淹

撇腳的退出方法,其實(shí)沒什么,主要是個人喜惡。
我喜歡用標(biāo)記,可以在任何平臺下使用都沒問題。


另外,我不明白為什么用了condition還要用GUARD
那樣不是死鎖了么?
BLOCK等待condition的時候,container被GUARD鎖死在一個線程內(nèi),其他線程調(diào)用PUSH的時候都會被擋在GUARD那里。


  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-25 21:42 Kevin Lynx

@飯中淹
不會的,condition和guard使用的都是同一個mutex。guard用于一般的同步,condition用于隊(duì)列元素為0時的臨界條件。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-25 23:08 影視劇

“如果數(shù)據(jù)庫配置在網(wǎng)絡(luò)上,那么往數(shù)據(jù)庫中插入一些日志信息將非常慢”,沒錯,有時還會發(fā)生網(wǎng)絡(luò)錯。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-26 01:52 飯中淹

@Kevin Lynx
是啊,當(dāng)元素為0,又正好BLOCK=TRUE的時候,就會在POP里面死循環(huán)了。
因?yàn)镻OP里的GUARD鎖住了MUTEX,PUSH的GUARD就會等在GUARD的MUTEX那里。這樣的話,POP就永遠(yuǎn)等不到CONDITION的SIGNAL。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程[未登錄] 2008-06-26 09:08 raof01

正準(zhǔn)備寫一篇類似的東西。被你搶先了……
還有沒有必要寫呢?  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程[未登錄] 2008-06-26 09:14 Kevin Lynx

@飯中淹
前面我說了,condition和guard使用的是同一個mutex,在condition的wait里,會先_external_mutex.release();,然后push的時候,就不會阻塞在guard那里,于是condition.signal(元素為0時,看下代碼),然后pop里的condition.wait就過了。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-26 10:30 空明流轉(zhuǎn)

最近準(zhǔn)備把我的軟件渲染器搞成異步的,思路也差不多和LZ一樣。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-26 12:39 飯中淹

@Kevin Lynx
這樣會造成很多誤解啊。。。。
WAIT完成,再去LOCK一下MUTEX么?  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-06-30 19:40 Wealth

@true
同意這種做法  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-07-02 09:27 yt

我倒是有個想法,可以考慮使用一個"特殊的日志消息",根據(jù)消息內(nèi)容得知是退出消息  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-07-02 19:45 ojoj

例如線程里 WaitFor...INFINITE了,那么它就無法處理消息,也無法判斷退出標(biāo)志變量,代碼卡在這里了。

我是這樣判斷,設(shè)置個計(jì)數(shù)器,可以是全局/局部,在線程執(zhí)行體里不斷自加,主進(jìn)程隔一段時間去比較這個值是否增大。如果沒有,則判斷線程已經(jīng)死掉,這樣就可以避免許多其他的異常而沒有捕捉到的情況。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-02 15:22 francis

原文如下:
void push_back( const value_type &data )
{
guard<mutex_type> g( _mutex );

if( _container.size() == 0 )
{
_condition.signal();
}

_container.push_back( data );
}
不知道此處這樣寫何解?
我覺得是不是應(yīng)該寫成這樣:
void push_back( const value_type &data )
{
guard<mutex_type> g( _mutex );

_container.push_back( data );
_condition.signal();
}
?  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-03 10:40 Kevin Lynx

@francis
你可以查找‘條件變量’(condition variable)的相關(guān)資料。
signal只在隊(duì)列尺寸為0時的push操作中調(diào)用,因?yàn)樵趐op中會在隊(duì)列尺寸為0時wait.  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 10:17 francis

@Kevin Lynx “signal只在隊(duì)列尺寸為0時的push操作中調(diào)用”沒必要這樣吧?只要push之后signal,信號量加1, pop時wait信號量減1,為0時wait就可以了  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 12:55 Kevin Lynx

@francis
關(guān)鍵在于,signal和wait會對外部mutex做操作。參見kl_condition.h相關(guān)代碼。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 15:32 francis

@Kevin Lynx signal并沒有對mutex操作,
void push_back( const value_type &data )
{
guard<mutex_type> g( _mutex );

_container.push_back( data );
_condition.signal();
}
這樣寫是不是好些?
  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 15:33 francis

if( _container.size() == 0 )
{
_condition.signal();
}
這么寫沒有必要  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 16:43 Kevin Lynx

@francis
我們看一次常規(guī)的同步操作:
push_front()
{
guard<mutex_type> g(_mutex );
...
}

pop_front()
{
guadr<mutex_type> g(_mutex );
...
}

那么,在消費(fèi)者線程里可能會不斷地去檢查隊(duì)列大小是否為0(size操作同樣會涉及到同步),
這浪費(fèi)了CPU資源。而如果:
pop_front()
{
guadr<mutex_type> g(_mutex );
while( size == 0 ) _cond.wait();
}
當(dāng)大小為0時,wait操作將阻塞此線程,從而讓出了CPU資源(wait會阻塞)。

另一方面,如果每次push操作都進(jìn)行條件變量的signal,這個所謂的原語操作開銷有多大?
查看condition::signal/wait代碼,其內(nèi)部還存在一個_wait_count的同步。另外,如果
每次push都signal的話,那么pop操作也需要進(jìn)行wait,這樣以來它其實(shí)已經(jīng)不是條件變量,
而是信號量了。

我們所要的效果,就是在隊(duì)列元素為0時,進(jìn)行pop操作的時候讓其阻塞而已。


  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 19:53 francis

@Kevin Lynx 注意看,想想當(dāng)有線程在wait,同時container不為空時的情況吧,明明container里有數(shù)據(jù),但是wait的線程卻取不出來。。。 這樣看來貌似是存在邏輯錯誤的。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-04 22:28 Kevin Lynx

@francis
while( _container.size() == 0 ) _condition.wait();
僅當(dāng)為空的情況下才wait的。代碼在邏輯上不存在大問題,因?yàn)檫@個基礎(chǔ)部件已經(jīng)被用于實(shí)際項(xiàng)目(用于保存驗(yàn)證服務(wù)器端的驗(yàn)證帳號)。
  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-05 01:09 francis

@Kevin Lynx
while( _container.size() == 0 ) _condition.wait();
并不能保證“有線程在wait,同時container不為空”,
是可以模擬出現(xiàn)的。這樣的話,邏輯就出問題了。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-05 09:00 Kevin Lynx

@francis
詳述下這種會出現(xiàn)問題的情況。如果可以模擬出現(xiàn)的話,麻煩基于multi_list這個類制造這種情況。  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-05 20:54 francis

:-) 不是太好找,應(yīng)該是沒什么問題的。
下面這個情況有太多假設(shè),:-)

有2線程在等待,
thread1.pop ->wait
thread2.pop ->wait

然后下面運(yùn)行
thread3.push
thread3.push
thread3.push
。。。

thread3 push之后會激活一個線程,假設(shè)thread1被激活,假設(shè)這個時候線程沒有切換,thread3繼續(xù)push之后才切換thread1, 這個時候, container被push了兩次,thread1這時取出一個數(shù)據(jù)處理,處理完之后切換線程,thread2還是繼續(xù)等待,thread3繼續(xù)push,這個時候假設(shè)又push了2個,
thread1由于沒有wait可以不停的取數(shù)據(jù),但是thread2就慘了,不是沒有數(shù)據(jù)可處理,而是它只能wait了。
  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-06 09:07 Kevin Lynx

@francis
我讀了幾遍你的這次回復(fù),希望我沒有誤解你的意思:
thread1被激活,取數(shù)據(jù),就可能導(dǎo)致container的size為0,一旦size為0,thread3繼續(xù)push的時候就可能會激活thread2。如果OS一直沒有調(diào)度到thread2,那么,container就可能經(jīng)歷過多次size為0,size不為0,也就是thread1和thread3發(fā)生多次數(shù)據(jù)交互。thread2看起來是慘了,因?yàn)閏ontainer曾經(jīng)有數(shù)據(jù),但是thread2卻沒取到?為什么呢?thread2根本沒被OS調(diào)度到,從沒有獲取到CPU控制權(quán),它又有什么理由不wait?

歸根結(jié)底,你說的這個問題,只是因?yàn)閠hread2沒有被調(diào)度到而已。
  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-06 12:55 francis

我說的就是會出現(xiàn)“container不空,但是有wait的線程”這種情況,這里就是thread2在wait.如果有更多的線程做push, thread3本身也在不停的push,這個時候,處理的線程只有thread1,thread2只能wait, 因?yàn)閏ontainer一直不空,永遠(yuǎn)沒法發(fā)出激活信息。當(dāng)然這樣不會出現(xiàn)什么錯誤,只是可能會和實(shí)際想的功能不符合,本意是想兩個線程處理container里的內(nèi)容,但是實(shí)際只有thread1在處理,thread2一直wait.  回復(fù)  更多評論   

# re: 建立異步操作組件:隊(duì)列和線程 2008-08-06 13:11 Kevin Lynx

@francis
thread2沒有獲得CPU權(quán)!thread2沒有被調(diào)度!
這里的用法完全是條件變量的標(biāo)準(zhǔn)用法,如果你硬是要從理論上認(rèn)為它有問題,那你可以去查條件變量相關(guān)資料。這里的結(jié)構(gòu)和條件變量通用用法一樣。你甚至可以找本操作系統(tǒng)書,在上面找到條件變量的使用結(jié)構(gòu)。你想推翻這一切?建議你大量查閱條件變量相關(guān)資料。如果你還認(rèn)為有問題,你應(yīng)該去對發(fā)明條件變量的某個可能已經(jīng)死掉的牛人說:你這個條件變量的結(jié)構(gòu)有問題。  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品一区在线| 欧美一区三区三区高中清蜜桃| 狠狠色综合网| 国内精品伊人久久久久av影院| 国产欧美一区二区精品仙草咪 | 欧美jizzhd精品欧美喷水| 久久久久亚洲综合| 美日韩精品视频| 亚洲破处大片| 欧美国产精品va在线观看| 亚洲人成啪啪网站| 亚洲欧美在线磁力| 蜜桃av一区| 欧美性事免费在线观看| 国产婷婷色一区二区三区| 亚洲国产成人精品久久| 亚洲性线免费观看视频成熟| 久久精品72免费观看| 亚洲国产精品第一区二区| 一本色道久久精品| 久久精品在线播放| 欧美日韩成人| 国产亚洲一区精品| 一本在线高清不卡dvd| 欧美在线高清| 亚洲精品午夜精品| 久久精品成人| 国产精品久久久久久影视| 91久久精品国产91久久性色| 欧美一区二区三区免费观看| 欧美激情视频在线免费观看 欧美视频免费一 | 久久成人18免费观看| 免费日韩成人| 午夜在线视频观看日韩17c| 欧美日韩国产高清| 在线精品国产欧美| 久久精品一区| 亚洲欧美成人综合| 国产精品久久久久影院色老大| 亚洲激情视频网| 欧美成人免费小视频| 久久久国产午夜精品| 国产一区二区高清不卡| 亚洲欧美精品在线| 一本到12不卡视频在线dvd| 女仆av观看一区| 怡红院av一区二区三区| 久久精品国产免费观看| 亚洲香蕉成视频在线观看| 欧美日韩国产精品一区| 欧美成人精品影院| 一区二区在线视频播放| 欧美综合国产精品久久丁香| 一本大道久久a久久精二百| 欧美.www| 亚洲国产日韩在线| 免费在线视频一区| 久久亚洲国产精品一区二区| 国产综合在线看| 久久另类ts人妖一区二区| 亚洲欧美久久| 韩国女主播一区| 久久久人成影片一区二区三区| 性色av一区二区三区红粉影视| 国产乱码精品一区二区三区五月婷| 亚洲深夜影院| 一区二区三区免费在线观看| 国产精品porn| 欧美一区二区三区播放老司机| 午夜精品久久久久久99热| 国产精品一卡二卡| 久久亚洲精品视频| 久久美女艺术照精彩视频福利播放| 国产在线精品自拍| 欧美成人免费在线观看| 欧美精品色综合| 亚洲国产欧美一区二区三区同亚洲 | 免费h精品视频在线播放| 91久久久久| 日韩一级裸体免费视频| 欧美日韩高清在线| 亚洲欧美大片| 久久人91精品久久久久久不卡| 91久久久久久国产精品| 夜夜爽av福利精品导航 | 91久久精品美女高潮| 欧美日韩1区2区| 国产曰批免费观看久久久| 欧美大胆a视频| 国产精品高清在线| 久久亚洲私人国产精品va媚药| 久久亚洲高清| 亚洲一本大道在线| 久久精彩视频| 中文日韩在线视频| 久久久免费精品视频| 99re6这里只有精品视频在线观看| 亚洲视频在线观看三级| 亚洲国产电影| 午夜精品久久久久| 亚洲图片在线| 老司机午夜精品视频在线观看| 亚洲视频在线观看网站| 欧美激情麻豆| 欧美在线免费观看亚洲| 日韩亚洲不卡在线| 欧美在线观看网址综合| 亚洲每日在线| 久久久久久久一区二区三区| 一区二区激情小说| 久久夜色精品国产| 午夜精品成人在线| 欧美日韩精品中文字幕| 久久久久久久久久久一区| 欧美日韩亚洲一区二区三区在线 | 欧美在线不卡视频| 欧美激情综合网| 美女露胸一区二区三区| 国产日产欧美精品| 亚洲系列中文字幕| 亚洲午夜国产成人av电影男同| 久久只精品国产| 久久综合福利| 一区精品久久| 久久亚洲二区| 欧美激情91| 亚洲国产三级| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲免费中文字幕| 欧美猛交免费看| 亚洲国产精品成人久久综合一区 | 国产精品av久久久久久麻豆网| 亚洲第一二三四五区| 国内精品久久久久久久果冻传媒 | 你懂的亚洲视频| 一区二区三区在线观看视频| 欧美一区二区视频网站| 久久久国产成人精品| 国产亚洲精品成人av久久ww| 亚洲免费在线| 久久精品一区二区三区不卡| 国产一区二区三区久久久| 久久av红桃一区二区小说| 久久九九国产精品| 一区在线观看视频| 另类综合日韩欧美亚洲| 欧美国产综合一区二区| 亚洲精品一区二| 欧美日韩在线播| 亚洲欧美日产图| 美女国内精品自产拍在线播放| 亚洲国产精品第一区二区| 欧美成人午夜激情视频| 亚洲美洲欧洲综合国产一区| 午夜精品福利在线观看| 韩国久久久久| 欧美精品日韩| 亚洲在线免费观看| 久久免费一区| 日韩亚洲国产欧美| 国产精品亚洲第一区在线暖暖韩国| 欧美一区二区三区播放老司机| 久久影音先锋| 一区二区三区欧美在线| 久久久久久成人| 欧美另类在线播放| 亚洲视频第一页| 久久亚洲一区二区三区四区| 亚洲啪啪91| 国产伦精品一区| 另类av一区二区| 亚洲午夜一区二区| 免费在线国产精品| 亚洲欧美另类国产| 亚洲国产精品视频| 国产精品家庭影院| 久久综合伊人77777麻豆| 亚洲激情综合| 久久精品一区二区国产| 日韩视频三区| 国产一区二区视频在线观看| 免费一级欧美片在线播放| 亚洲一区二区三区四区视频| 久久精品动漫| 日韩亚洲视频| 亚洲成人在线观看视频| 国产精品午夜av在线| 欧美激情国产高清| 久久精品一级爱片| 亚洲少妇中出一区| 亚洲国产乱码最新视频| 久久久久国产精品午夜一区| 亚洲一区二区三区精品视频| 亚洲人成网站精品片在线观看| 国产精品久久午夜| 欧美丝袜一区二区| 欧美国产日韩xxxxx| 久久精品亚洲一区| 欧美一区二区视频在线观看| 亚洲性感激情|