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

cexer

cexer
posts - 12, comments - 334, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

轉(zhuǎn)帖請(qǐng)注明出處 http://m.shnenglu.com/cexer/archive/2008/07/08/55670.html

  單件(Singelton)模式可以說是眾多設(shè)計(jì)模式當(dāng)中,理解起來最容易,概念最為簡(jiǎn)單的一個(gè)。并且在實(shí)際的設(shè)計(jì)當(dāng)中也是使用得又最為頻繁的,甚至有很多其它的模式都要借助單件才能更好地實(shí)現(xiàn)。然而就是這樣被強(qiáng)烈需求的“一句話模式”(一句話就能闡述明白),雖然有無數(shù)的牛人浸淫其中,至今也沒有誰鼓搗出一個(gè)完美的實(shí)現(xiàn)。我小菜鳥一只自然更不敢逢人便談單件。不過這個(gè)貼的主題是跟單件模式是密不可分的。

  什么又叫做“線程相關(guān)的單件模式”呢?也許你已經(jīng)顧名思義猜出了八九分。不過還是允許我簡(jiǎn)單地用實(shí)例說明一下。

  假設(shè)你要設(shè)計(jì)了一個(gè)簡(jiǎn)單的 GUI 框架,這個(gè)框架當(dāng)中需要這樣一個(gè)全局變量(單件模式),它保存了所有窗口句柄與窗口指針的映射(我見過的數(shù)個(gè)的開源 GUI 框架都有類似的東西。)。在 WIN32 平臺(tái)上就是這樣一個(gè)簡(jiǎn)單的東西:

    //窗口的包裝類
class Window
{
HWND m_hwnd;
public:
bool create();
bool destroy();

//其它細(xì)節(jié)
};

//窗口句柄與其對(duì)象指針的映射
typedef map<HWND,Window*> WindowMap;
typedef WindowMap::iterator WindowIter;
WindowMap theWindowMap;




  每創(chuàng)建一個(gè)窗口,就需要往這個(gè) theWindowMap 當(dāng)中添加映射。每銷毀一個(gè)窗口,則需要從其中刪除掉相關(guān)映射。實(shí)現(xiàn)代碼類似:

    //創(chuàng)建窗口
bool Window::create()
{
m_hwnd=::CreateWindow(/*參數(shù)略*/);
if(!::IsWindow(m_hwnd))
return false;

theWindowMap[m_hwnd]=this; //添加映射
return true;
}

//銷毀窗口
bool Window::destroy()
{
::DestroyWindow(m_hwnd);

theWindowMap.erase(m_hwnd); //刪除映射
return true;
}


  你可以用任何可能的單件模式來實(shí)現(xiàn)這樣一個(gè)全局變量 theWindowMap,它會(huì) 工作得很好。但是當(dāng)如果考慮要給程序添加多線程支持(“多線程”是如此麻煩,它總愛和“但是”一起出現(xiàn),給本來進(jìn)行得很順利的事情引起波折。),就會(huì)發(fā)現(xiàn)此時(shí)也許純粹的單件模式并不是最好的選擇。例如一個(gè)線程同時(shí)創(chuàng)建窗口,那么兩個(gè)線程同時(shí)調(diào)用:

    theWindowMap[m_hwnd]=this;


  這顯然不是一個(gè)原子操作,可以肯定如果你堅(jiān)持這樣干你的程序會(huì)慢慢走向崩潰,幸運(yùn)一點(diǎn)只是程序運(yùn)行結(jié)果錯(cuò)誤,如果你恰好那幾天印堂發(fā)暗面色發(fā)灰,說不定就因?yàn)檫@小小的錯(cuò)誤,被無良的BOSS作為借口開除掉了,那可是個(gè)悲慘的結(jié)局。

  當(dāng)然大多數(shù)的單件模式已經(jīng)考慮到了多線程的問題。它們的解決方案就是給加上線程鎖 ,我在數(shù)個(gè)開源的 GUI 框架看到他們都采用了這種解決方案。不過這樣做,在線程同步過程當(dāng)中,會(huì)產(chǎn)生與 GUI 框架邏輯不相關(guān)的同步消耗,雖然不是什么大不了的消耗,但是客戶可能因此就選擇了你的竟?fàn)帉?duì)手,如果線程竟?fàn)幖ち遥趶?qiáng)烈渴求資源的環(huán)境(如小型移動(dòng)設(shè)置)當(dāng)中,這種消耗更是不可忽視的。

  實(shí)際上在應(yīng)用當(dāng)中,極少有線程需要插入刪除其它線程創(chuàng)建的窗口映射(如果確實(shí)有這種需要,那么可以肯定項(xiàng)目的設(shè)計(jì)上出了問題)。在這種情況下本線程創(chuàng)建窗口映射都將只是本線程存取,類似“Thread-Specific”的概念。也就是說,theWindowMap 當(dāng)中其它線程創(chuàng)建的窗口的映射對(duì)于本線程來說都是不需關(guān)心的,我們卻要為那部分不必要東西整天提心吊膽并付出運(yùn)行時(shí)消耗的代價(jià),這也有點(diǎn)像“穿著棉襖洗澡”。但是怎么樣才能做到更輕松爽快些呢?

  就本例問題而言,我們需要這樣一種變量來保存窗口映射,它針對(duì)每個(gè)線程有不同的值(Thread-Specific Data),這些值互不影響,并且所有線程對(duì)它的訪問如同是在訪問一個(gè)進(jìn)程內(nèi)的全局變量(Singelton)。

  如果你是熟悉多線程編程的人,那么“Thread-Specific ”一定讓你想起了什么。是的,“Thread-Specific Storage ” (線程相關(guān)存存諸,簡(jiǎn)稱 TSS ),正是我們需要的,這是大多數(shù)操作系統(tǒng)都提供了的一種線程公共資源安全機(jī)制,這種機(jī)制允許以一定方式創(chuàng)建一個(gè)變量,這個(gè)變量在所在進(jìn)程當(dāng)中的每個(gè)線程當(dāng)中,可以擁有不同的值。在 WIN32 上,這個(gè)變量就稱為“索引”,其相關(guān)的值則稱為“槽”, “Thread-Local Storage”(線程局部存諸,簡(jiǎn)稱 TLS )機(jī)制。它的提了供這樣幾個(gè)函數(shù)來定義,設(shè)置,讀取線程相關(guān)數(shù)據(jù)(關(guān)于 TLS 的更多信息,可以查閱 MSDN ):

    //申請(qǐng)一個(gè)“槽”的索引。
DWORD TlsAlloc( void );

//獲得調(diào)用線程當(dāng)中指定“槽”的值。
VOID* TlsGetValue( DWORD dwTlsIndex );

//設(shè)置調(diào)用線程當(dāng)中指定“槽”的值。
BOOL TlsSetValue( DWORD dwTlsIndex,VOID* lpTlsValue );

//釋放掉申請(qǐng)的“槽”的索引
BOOL TlsFree( DWORD dwTlsIndex );

  具體使用流程方法:先調(diào)用 TlsAlloc 申請(qǐng)一個(gè)“索引”,然后線程在適當(dāng)時(shí)機(jī)創(chuàng)建一個(gè)對(duì)象并調(diào)用 TlsSetValue 將“索引”對(duì)應(yīng)的“槽”設(shè)置為該對(duì)象的指針,在此之后即可用 TlsGetValue 訪問該“糟”。最后在不需要的時(shí)候調(diào)用 TlsFree ,如在本例當(dāng)中,調(diào)用 TlsFree 的最佳時(shí)機(jī)是在進(jìn)程結(jié)束時(shí)。

  先封裝一下 TlsAlloc 和 TlsFree  以方便對(duì) ”索引“的管理。

    class TlsIndex
{
public:
TlsIndex()
:m_index(::TlsAlloc())
{}

~TlsIndex()
{
::TlsFree(m_index);
}

public:
operator DWORD() const
{
return m_index;
}

private:
DWORD m_index;
};

  
  如你所見,類 TlsIndex 將在構(gòu)造的時(shí)候申請(qǐng)一個(gè)“索引”,在析構(gòu)的時(shí)候釋放此“索引”。

  在本例當(dāng)中 TlsIndex 的對(duì)象應(yīng)該存在進(jìn)程的生命周內(nèi),以保證在進(jìn)程退出之前,這個(gè)“索引”都不會(huì)被釋放,這樣的 TlsIndex 對(duì)象聽起來正像一個(gè)全局靜態(tài)對(duì)象,不過 Meyers Singelton (用函數(shù)內(nèi)的靜態(tài)對(duì)象實(shí)現(xiàn))在這里會(huì)更適合,因?yàn)槲覀儾恍枰獙?duì)這個(gè)對(duì)象的生命周末進(jìn)行精確控制,只需要它在需要的時(shí)候創(chuàng)建,然后在進(jìn)程結(jié)束前銷毀即可。這種方式只需要很少的代碼即可實(shí)現(xiàn),比如:

    DWORD windowMapTlsIndex()
{
static TlsIndex s_ti;  //提供自動(dòng)管理生命周期的“索引”
return s_ti;
}


  利用這個(gè)“索引”,我們就能實(shí)現(xiàn)上述“Thread-Specific”的功能:

    WindowMap* windowMap()
{
WindowMap* wp=reinterpret_cast<WindowMap*>(::TlsGetValue(windowMapTlsIndex()));
if(!wp)
{
wp=new WindowMap();
::TlsSetValue(windowMapTlsIndex(),wp);
}
return wp;
}

#define theWindowMap *(windowMap())

  
  注意各線程訪問以上的代碼不會(huì)存在竟?fàn)帯_@樣就實(shí)現(xiàn)了一個(gè)線程安全且無線程同步消耗版本的“全局對(duì)象” theWindowMap 。我們甚至不用改變Window::create,Window::destory,queryWindow 的代碼,

  這幾個(gè)簡(jiǎn)單的函數(shù)看起來似乎不像一個(gè)“模式”,但是它確實(shí)是的。

  現(xiàn)在總結(jié)一下“線程相關(guān)的單件模式”的概念:保證一個(gè)類在一個(gè)線程當(dāng)中只有一個(gè)實(shí)例,并提供一個(gè)訪問它的線程內(nèi)的訪問點(diǎn)的模式。

  為了不重復(fù)地制造車輪,我將此類應(yīng)用的模式封裝了一下:

    template<typename TDerived>
class TlsSingelton
{
typedef TDerived _Derived;
typedef TlsSingelton<TDerived> _Base;

public:
static _Derived* tlsInstance()
{
return tlsCreate();
}

protected:
static _Derived* tlsCreate()
{
_Derived* derived=tlsGet();
if(derived)
return derived;

derived=new _Derived();
if(derived && TRUE==::TlsSetValue(tlsIndex(),derived))
return derived;

if(derived)
delete derived;

return NULL;
}

static bool tlsDestroy()
{
_Derived* derived=tlsGet();
if(!derived)
return false;

delete derived;
return true;
}

static DWORD tlsIndex()
{
static TlsIndex s_tlsIndex;
return s_tlsIndex;
}

private:
static _Derived* tlsGet()
{
return reinterpret_cast<_Derived*>(::TlsGetValue(tlsIndex()));
}

static bool tlsSet(_Derived* derived)
{
return TRUE==::TlsSetValue(tlsIndex(),derived);
}

//noncopyable
private:
TlsSingelton(const _Base&);
TlsSingelton& operator=(const _Base&);
};


  將 tlsCreate,tlsDestroy 兩個(gè)函數(shù)設(shè)置為保護(hù)成員,是為了防止一些不三不四吊爾啷噹的程序隨意地刪除。

  示例:

    class WindowMapImpl:public TlsSingelton<WindowMap>
{
WindowMap m_map;
public:
WidnowMap& theWindowMapImpl()
{
return m_map;
}

public:
~WindowMapImpl();

protected:
WindowMapImpl(); //只能通過tlsCreate創(chuàng)建
friend class _Base;
};

#define theWindowMap (WindowMapImpl::tlsInstance()->theWindowMapImpl())



  仍不需要修改原有窗口代碼。

Feedback

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-09 16:57 by www.helpsoff.com.cn
哈哈,有意思!看到一半的時(shí)候,心想有必要引入tls嗎,只要設(shè)好編譯選項(xiàng),map應(yīng)該是線程安全的呀;不過看到后面,把tls引入然后封裝到原有實(shí)現(xiàn)上去,覺得很精彩,其實(shí)已經(jīng)跳出了討論所謂singleton和線程安全的范疇了,雖然目的是這個(gè)。

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-09 18:32 by cexer
呵呵謝謝耐心看完。map可以通過編譯器設(shè)置線程安全?我還不知道呢。不過引入tls與“線程相關(guān)的單件”,是為了可以讓更多更復(fù)雜的此類應(yīng)用更容易實(shí)現(xiàn)。還有map的線程安全是由實(shí)現(xiàn)提供的(非標(biāo)準(zhǔn)),應(yīng)該不是所有編譯器都支持的吧?

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-10 01:44 by www.helpsoff.com.cn
我大致記得用cl編譯鏈接生成binary的時(shí)候帶"/MT"就是連接多線程庫,不過印象不深了,博主有興趣可以看看。

我同意博主的說法,引入tls確實(shí)是為實(shí)現(xiàn)類似應(yīng)用做好了封裝。

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-10 09:02 by cexer
@www.helpsoff.com.cn
這個(gè)"/MT"應(yīng)該指的鏈接是微軟運(yùn)行時(shí)庫,C運(yùn)行時(shí)庫。C++標(biāo)準(zhǔn)庫對(duì)包括map在內(nèi)的容器在多線程環(huán)境當(dāng)中的情況沒有采取任何的保護(hù)措施。

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-10 14:09 by www.helpsoff.com.cn
對(duì)頭,/MT是指連接微軟的runtime lib,相對(duì)于標(biāo)準(zhǔn)庫來將,這個(gè)庫的實(shí)現(xiàn)是支持多線程的。不過博主說的對(duì),連接這個(gè)庫并不能保證map是線程安全了。獻(xiàn)丑了...

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-10 22:53 by 夢(mèng)在天涯
TlsObject<***> 這個(gè)東東哪里來的那,TLS倒是蠻好用的哦!

http://m.shnenglu.com/mzty/archive/2007/08/01/28892.html

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2008-07-10 23:22 by cexer
@夢(mèng)在天涯
應(yīng)該是TlsSingelton,我寫錯(cuò)了哈,謝謝提醒。

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2009-08-31 22:42 by stidio
這樣寫,用處不大,其實(shí)線程局部化本身用處就不大
如果這樣寫,同一個(gè)線程中持有的是不同的映射實(shí)例,而很多情況(不僅僅是窗口映射),這樣做的目的,是為了根據(jù)一個(gè)index獲得一個(gè)結(jié)果,也就是查詢;
如果這樣最,對(duì)于跨線程查詢,你必須破壞你的設(shè)計(jì);

不知道是不是我理解的問題,單件模式的引出,是為了確定資源的唯一性;而你的這個(gè)恰恰不是;例如:
張三,李四的老板是王五,那王五對(duì)于張三,李四來說,是他的"單件"
張7,張8的爸爸是張9,那張9是單件

而你卻構(gòu)建了一個(gè),張9和王五的集合,說這是另外4個(gè)人的單件,這并不符合唯一性條件;

關(guān)于單件模型的多線程問題,其實(shí)單件本身沒多線程問題,多線程問題的引入是在對(duì)單件對(duì)象的使用上;如果說單件存在著多線程問題,那也僅僅需要在創(chuàng)建時(shí)鎖定(比如說2個(gè)線程同時(shí)獲得,都為空,創(chuàng)建2次;這樣需要在創(chuàng)建時(shí)鎖定,并做二次判斷,如
if(xx == 0) {
lock();
if(xx == 0)
xx = new XX;
....
}
而其實(shí)大多數(shù)情況不需要這樣來折騰;


超哥不錯(cuò)哈,出去后的確進(jìn)步了很多;

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2009-09-01 12:15 by cexer
@stidio
這個(gè)設(shè)計(jì)是設(shè)計(jì)給不跨線程的應(yīng)用的,主要考慮在這種應(yīng)用下,如果線程太多,都去查詢同一個(gè)全局的東西,大多數(shù)線程都一直處于等待資源的狀態(tài),比較浪費(fèi)CPU時(shí)間。
這是在公司時(shí)寫的哈,出來后倒沒寫了,感覺是人越來越懶了,寫程序越來越?jīng)]激情

# re: 線程相關(guān)的單件模式(Thread-Specific Singelton)  回復(fù)  更多評(píng)論   

2010-05-12 16:10 by ZeroQ
#define theWindowMap (WindowMapImpl::tlsInstance()->theWindowMapImpl())
上面一行中,WindowMapImpl::tlsInstance()返回的是WindowMap實(shí)例,而WindowMap并沒有theWindowMapImpl()方法,不知道這樣是如何實(shí)現(xiàn)的。請(qǐng)教嘍。。。

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            巨胸喷奶水www久久久免费动漫| 欧美国产精品一区| 国产精品视频不卡| 久久不射中文字幕| 欧美专区日韩专区| 久久福利精品| 欧美激情乱人伦| 亚洲欧洲日夜超级视频| 午夜一区不卡| 欧美另类在线观看| 一本色道综合亚洲| 欧美在线看片| 久久久久久一区二区| 亚洲欧美精品suv| 美女国内精品自产拍在线播放| 亚洲第一黄网| 免费观看久久久4p| 亚洲欧洲一区二区在线播放| 亚洲国产精品嫩草影院| 久久精品72免费观看| 亚洲国产欧美一区二区三区同亚洲 | 久久综合中文字幕| 国产精品国产三级国产aⅴ无密码| 久久国产66| 亚洲影院免费观看| av不卡免费看| 久久久久一区二区三区| 亚洲二区在线观看| 国产精品久久久99| 欧美α欧美αv大片| 亚洲欧洲日韩综合二区| 亚洲影音一区| 午夜精品在线观看| 久久精品99国产精品酒店日本| 欧美日韩一区二区在线视频| 韩国成人精品a∨在线观看| 欧美在线在线| 欧美一区二视频在线免费观看| 一区二区欧美在线观看| 久久精品日韩欧美| 欧美午夜精品久久久久久人妖 | 欧美日韩免费看| 亚洲免费在线视频一区 二区| 亚洲欧洲日产国产网站| 男女激情视频一区| 正在播放欧美一区| 欧美午夜视频在线| 老司机精品视频网站| 欧美日韩亚洲视频一区| 玖玖视频精品| 亚洲毛片视频| 亚洲丶国产丶欧美一区二区三区| 久久精品在线| 亚洲国产精品精华液网站| 一区二区欧美国产| 亚洲伦理精品| 91久久久久久久久久久久久| 亚洲永久免费| 欧美电影免费观看大全| 国产精品日韩欧美| 在线观看视频一区| 久久精品中文字幕一区| 99精品国产在热久久| 亚洲国产影院| 久久嫩草精品久久久精品| 午夜精品久久久久久久99热浪潮| 国产精品久久久久久久浪潮网站| 在线性视频日韩欧美| 日韩视频二区| 国产精品嫩草99av在线| 久久精品视频在线免费观看| 欧美中文字幕不卡| 在线精品视频一区二区| 欧美激情亚洲另类| 欧美激情综合亚洲一二区| 亚洲一区日韩在线| 亚洲欧美日韩专区| 精久久久久久| 亚洲欧洲一二三| 国产精品国产三级国产a| 亚洲欧美日韩精品久久亚洲区 | 久久久久九九视频| 久久久www| 亚洲精品婷婷| 亚洲一区在线播放| 在线观看成人网| 亚洲精选视频在线| 国产欧美一区二区精品仙草咪 | 国产精品久久福利| 亚洲精品少妇| 国产精品亚洲欧美| 久久精品夜夜夜夜久久| 麻豆av一区二区三区| 在线综合+亚洲+欧美中文字幕| 亚洲一区国产精品| 亚洲高清一区二| 亚洲视频欧美视频| 亚洲经典在线| 亚欧美中日韩视频| 一本色道**综合亚洲精品蜜桃冫 | 欧美精品一区二区久久婷婷| 亚洲影院在线观看| 在线激情影院一区| 国产精品久久久久一区二区三区| 免费的成人av| 国产精品美女久久久久av超清| 蜜月aⅴ免费一区二区三区| 国产一区二区成人| 欧美天堂亚洲电影院在线观看 | 久久精品女人天堂| 国产区在线观看成人精品| 亚洲国产精品va在线观看黑人 | 夜夜嗨av色综合久久久综合网| 午夜精品美女久久久久av福利| 亚洲欧美日韩国产| 一区二区精品| 99精品欧美一区二区蜜桃免费| 久久久久久久一区二区三区| 久久香蕉精品| 欧美中文字幕精品| 亚洲一区二区三区三| 国产精品www| 久久精品夜色噜噜亚洲a∨ | 久久狠狠婷婷| 国产一区二区三区奇米久涩| 亚洲午夜电影网| 亚洲国产三级在线| 午夜精品久久久久久99热软件| 欧美精品www在线观看| 伊人婷婷欧美激情| 国产精品盗摄久久久| 国产精品视频专区| 玖玖视频精品| 国内精品亚洲| 久久三级福利| 国产在线不卡精品| 欧美一区二区三区在线免费观看| 亚洲永久视频| 欧美日韩午夜精品| 亚洲精品美女在线| 亚洲日本精品国产第一区| 毛片基地黄久久久久久天堂| 欧美成人免费一级人片100| 国产欧美在线| 国产精品国产三级国产aⅴ入口 | 久久成人这里只有精品| 欧美日韩中文字幕精品| 日韩午夜电影av| 在线亚洲成人| 欧美先锋影音| 久久av一区| 欧美高清日韩| 99精品欧美一区| 国产精品美女www爽爽爽| 亚洲欧美在线观看| 久久天天狠狠| 亚洲日韩第九十九页| 欧美精品一区二区三区视频| 亚洲香蕉伊综合在人在线视看| 欧美伊久线香蕉线新在线| 国产亚洲一区二区在线观看| 久久躁狠狠躁夜夜爽| 亚洲三级免费电影| 亚洲性视频h| 狠狠色2019综合网| 欧美激情按摩在线| 亚洲在线电影| 欧美肥婆bbw| 99精品国产热久久91蜜凸| 欧美激情亚洲另类| 国产目拍亚洲精品99久久精品| 在线观看国产日韩| 欧美一区二区三区播放老司机| 亚洲福利视频三区| 好吊一区二区三区| 欧美三日本三级少妇三99| 欧美激情一区二区三区全黄| 国产日韩一区二区三区在线播放| 亚洲人人精品| 亚洲视频网在线直播| 欧美国产乱视频| 亚洲欧美综合一区| 国产精品啊v在线| 亚洲视频在线观看网站| 久久久www| 久久人体大胆视频| 亚洲人体偷拍| 亚洲视频日本| 欧美高清免费| 亚洲欧美综合v| 久久精品人人做人人综合| 亚洲网站在线看| 夜夜嗨av一区二区三区中文字幕| 国产伦精品一区二区三区四区免费 | 亚洲美女电影在线| 在线成人av.com| 欧美另类极品videosbest最新版本| 亚洲在线一区二区三区| 亚洲国产精品日韩| 久久国产精品99国产|