精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++11 修復(fù)了雙重檢查鎖定問(wèn)題

開發(fā) 后端
雙重檢查鎖定模式(DCLP)在無(wú)鎖編程(lock-free programming)中經(jīng)常被討論,直到2004年,JAVA才提供了可靠的雙重檢查鎖定實(shí)現(xiàn)。而在C++11之前,C++沒(méi)有提供一種該模式的可移植的可靠實(shí)現(xiàn)。

雙重檢查鎖定模式(DCLP)在無(wú)鎖編程(lock-free programming)中經(jīng)常被討論,直到2004年,JAVA才提供了可靠的雙重檢查鎖定實(shí)現(xiàn)。而在C++11之前,C++沒(méi)有提供一種該模式的可移植的可靠實(shí)現(xiàn)。

隨著雙重檢查鎖定模式在各語(yǔ)言實(shí)現(xiàn)上存在的缺點(diǎn)暴露,人們開始研究如何安全可靠地實(shí)現(xiàn)它。2000年,一個(gè)JAVA高性能研究小組發(fā)布了一篇聲明《雙重檢查鎖定可能導(dǎo)致鎖定無(wú)效》。2004年,Scott Meyers 和Andrei Alexandrescu聯(lián)合發(fā)表了一篇名為《C++實(shí)現(xiàn)雙重檢查鎖定存在嚴(yán)重缺陷》。這兩篇論文都是重點(diǎn)闡述了雙重檢查鎖定(DCLP)是什么,以及雙重檢查鎖定的意義,和當(dāng)前的各語(yǔ)言實(shí)現(xiàn)存在諸多不足。

現(xiàn)如今,JAVA為了安全地實(shí)現(xiàn)雙重檢查鎖定修改了其內(nèi)存模型,并引入了關(guān)鍵詞volatile。與此同時(shí),C++構(gòu)建了一個(gè)全新的內(nèi)存模型和原子 操作庫(kù)(atomic),使得不同編譯器實(shí)現(xiàn)雙重檢查鎖定(DCLP)更為容易。為了在更早期的C\C++編譯器中實(shí)現(xiàn)DCLP,在C++11引入了一個(gè) 名為Mintomic的庫(kù),在今年早些時(shí)候由我發(fā)布了。

過(guò)去的一段時(shí)間,我都著力于C++中實(shí)現(xiàn)DCLP的研究。

什么是雙重檢查鎖定?

如果你想在多線程編程中安全使用單件模式(Singleton),最簡(jiǎn)單的做法是在訪問(wèn)時(shí)對(duì)其加鎖,使用這種方式,假定兩個(gè)線程同時(shí)調(diào)用Singleton::getInstance方法,其中之一負(fù)責(zé)創(chuàng)建單件:

  1. Singleton* Singleton::getInstance() { 
  2.     Lock lock;      // scope-based lock, released automatically when the function returns 
  3.     if (m_instance == NULL) { 
  4.         m_instance = new Singleton; 
  5.     } 
  6.     return m_instance; 

使用這種方式是可行的,但是當(dāng)單件被創(chuàng)建之后,實(shí)際上你已經(jīng)不需要再對(duì)其進(jìn)行加鎖,加鎖雖然不一定導(dǎo)致性能低下,但是在重負(fù)載情況下,這也可能導(dǎo)致響應(yīng)緩慢。

使用雙重檢查鎖定模式避免了在單件對(duì)象已經(jīng)創(chuàng)建好之后進(jìn)行不必要的鎖定,然而實(shí)現(xiàn)卻有點(diǎn)復(fù)雜,在Meyers-Alexandrescu的論文中也 有過(guò)闡述,文中提出了幾種存在缺陷的實(shí)現(xiàn)方式,并逐一解釋了為什么這樣實(shí)現(xiàn)存在問(wèn)題。在論文的結(jié)尾的第12頁(yè),給出了一種可靠的實(shí)現(xiàn)方式,實(shí)現(xiàn)依賴一種標(biāo) 準(zhǔn)中未規(guī)范的內(nèi)存柵欄技術(shù)。

  1. Singleton* Singleton::getInstance() { 
  2.     Singleton* tmp = m_instance; 
  3.     ...                     // insert memory barrier 
  4.     if (tmp == NULL) { 
  5.         Lock lock; 
  6.         tmp = m_instance; 
  7.         if (tmp == NULL) { 
  8.             tmp = new Singleton; 
  9.             ...             // insert memory barrier 
  10.             m_instance = tmp; 
  11.         } 
  12.     } 
  13.     return tmp; 

這里,我們可以看到:如模式名稱一樣,代碼中實(shí)現(xiàn)了雙重校驗(yàn),在m_instance指針為NULL時(shí),我們做了一次鎖定,這一過(guò)程在***創(chuàng)建該對(duì)象的線程可見。在創(chuàng)建線程內(nèi)部構(gòu)造塊中,m_instance被再一次檢查,以確保該線程僅創(chuàng)建了一份對(duì)象副本。

這是雙重檢查鎖定的實(shí)現(xiàn),只不過(guò)在被高亮的代碼行中還缺乏了內(nèi)存柵欄技術(shù)做保證,在此文寫就之際,C/C++各編譯器未對(duì)該實(shí)現(xiàn)進(jìn)行統(tǒng)一,而在C++11標(biāo)準(zhǔn)中,對(duì)這種情況下的實(shí)現(xiàn)進(jìn)行了完善和統(tǒng)一。

在C++11中獲取和釋放內(nèi)存柵欄

在C++11中,你可以獲取和釋放內(nèi)存柵欄來(lái)實(shí)現(xiàn)上述功能(如何獲取和釋放內(nèi)存柵欄在我上一篇博文中有講述)。為了使你的代碼在C++各種實(shí)現(xiàn)中具 備更好的可移植性,你應(yīng)該使用C++11中新增的atomic類型來(lái)包裝你的m_instance指針,這使得對(duì)m_instance的操作是一個(gè)原子操作。下面的代碼演示了如何使用內(nèi)存柵欄,請(qǐng)注意代碼高亮部分:

  1. std::atomic<Singleton*> Singleton::m_instance; 
  2. std::mutex Singleton::m_mutex; 
  3.   
  4. Singleton* Singleton::getInstance() { 
  5.     Singleton* tmp = m_instance.load(std::memory_order_relaxed); 
  6.     std::atomic_thread_fence(std::memory_order_acquire);  // 編注:原作者提示注意的 
  7.     if (tmp == nullptr) { 
  8.         std::lock_guard<std::mutex> lock(m_mutex); 
  9.         tmp = m_instance.load(std::memory_order_relaxed); 
  10.         if (tmp == nullptr) { 
  11.             tmp = new Singleton; 
  12.             std::atomic_thread_fence(std::memory_order_release); // 編注:作者提示注意的 
  13.             m_instance.store(tmp, std::memory_order_relaxed); 
  14.         } 
  15.     } 
  16.     return tmp; 

上述代碼在多核系統(tǒng)中仍然工作正常,這是因?yàn)閮?nèi)存柵欄技術(shù)在創(chuàng)建對(duì)象線程和使用對(duì)象線程之間建立了一種“同步-與”的關(guān)系(synchronizes-with)。Singleton::m_instance扮演了守衛(wèi)變量的角色,而單件本身則作為負(fù)載內(nèi)容。

two-cones-dclp

而其他存在缺陷的雙重檢查鎖定實(shí)現(xiàn)都缺乏該機(jī)制的保障:在沒(méi)有“同步-與”關(guān)系保證的情況下,***個(gè)創(chuàng)建線程的寫操作,確切地說(shuō)是在其構(gòu)造函數(shù)中, 可以被其他線程感知,即m_instance指針能被其他線程訪問(wèn)!創(chuàng)建單件線程中的鎖也不起作用,由于該鎖對(duì)其他線程不可見,從而導(dǎo)致在某些情況下,創(chuàng) 建對(duì)象被執(zhí)行多次。

如果你想了解關(guān)于內(nèi)存柵欄技術(shù)是如何可靠實(shí)現(xiàn)雙重檢查鎖定的內(nèi)部原理,在我的前一篇文章中有一些背景信息(previous post),之前的博客也有一些相關(guān)內(nèi)容。

#p#

使用Mintomic 內(nèi)存柵欄

Mintomic是一個(gè)很小的c庫(kù),提供了C++11 atomic庫(kù)中的一些功能函數(shù)子集,包含獲取和釋放內(nèi)存柵欄,同時(shí)它能工作在早期的編譯器之上。Mintomic依賴于與C++11相似的內(nèi)存模型—— 確切地說(shuō)是不使用Out-of-thin-air存儲(chǔ)——這一技術(shù)在早期編譯器中未進(jìn)行實(shí)現(xiàn),而這是在沒(méi)有C++11標(biāo)準(zhǔn)情況下我們能做的***實(shí)現(xiàn)。以我 多年C++多線程開發(fā)的經(jīng)驗(yàn)看來(lái),Out-of-thin-air存儲(chǔ)并不流行,而且大多數(shù)編譯器會(huì)避免實(shí)現(xiàn)它。

下面的代碼演示了如何使用Mintomic的獲取和釋放內(nèi)存柵欄機(jī)制實(shí)現(xiàn)雙重檢查鎖定,基本上與上面的例子類似:

  1. mint_atomicPtr_t Singleton::m_instance = { 0 }; 
  2. mint_mutex_t Singleton::m_mutex; 
  3.   
  4. Singleton* Singleton::getInstance() { 
  5.     Singleton* tmp = (Singleton*) mint_load_ptr_relaxed(&m_instance); 
  6.     mint_thread_fence_acquire(); 
  7.     if (tmp == NULL) { 
  8.         mint_mutex_lock(&m_mutex); 
  9.         tmp = (Singleton*) mint_load_ptr_relaxed(&m_instance); 
  10.         if (tmp == NULL) { 
  11.             tmp = new Singleton; 
  12.             mint_thread_fence_release(); 
  13.             mint_store_ptr_relaxed(&m_instance, tmp); 
  14.         } 
  15.         mint_mutex_unlock(&m_mutex); 
  16.     } 
  17.     return tmp; 

為了實(shí)現(xiàn)獲取和釋放內(nèi)存柵欄,Mintomic會(huì)試圖在其支持的編譯器平臺(tái)產(chǎn)生***效的機(jī)器碼。例如,下面的匯編代碼來(lái)自Xbox 360,使用的是PowerPC處理器。在該平臺(tái)上,內(nèi)聯(lián)的lwsync關(guān)鍵字是針對(duì)獲取和釋放內(nèi)存柵欄的優(yōu)化指令。

ppc-double-checked-mintomic

上述采用C++11標(biāo)準(zhǔn)庫(kù)編譯的例子在PowerPC處理器編譯應(yīng)該會(huì)產(chǎn)生一樣的匯編代碼(理想情況下)。不過(guò),我沒(méi)有能夠在PowerPC下編譯C++11來(lái)驗(yàn)證這一點(diǎn)。

使用C++11低階指令順序約束

在C++11中使用內(nèi)存柵欄鎖定技術(shù)可以很方便地實(shí)現(xiàn)雙重檢查鎖定。同時(shí)也保證在現(xiàn)今流行的多核系統(tǒng)中產(chǎn)生優(yōu)化的機(jī)器碼(Mintomic也能做到 這一點(diǎn))。不過(guò)使用這種方式并不是常用,在C++11中更好的實(shí)現(xiàn)方式是使用保證低階指令執(zhí)行順序約束的原子操作。之前的圖片中可以看到,一個(gè)寫-釋放操 作可以與一個(gè)獲取-讀操作同步:

  1. std::atomic<Singleton*> Singleton::m_instance; 
  2. std::mutex Singleton::m_mutex; 
  3.   
  4. Singleton* Singleton::getInstance() { 
  5.     Singleton* tmp = m_instance.load(std::memory_order_acquire); 
  6.     if (tmp == nullptr) { 
  7.         std::lock_guard<std::mutex> lock(m_mutex); 
  8.         tmp = m_instance.load(std::memory_order_relaxed); 
  9.         if (tmp == nullptr) { 
  10.             tmp = new Singleton; 
  11.             m_instance.store(tmp, std::memory_order_release); 
  12.         } 
  13.     } 
  14.     return tmp; 

從技術(shù)上講,使用這種形式的無(wú)鎖同步比獨(dú)立內(nèi)存柵欄技術(shù)限制更低。上述操作只是為了防止自身操作的內(nèi)存排序,而內(nèi)存柵欄技術(shù)則阻止了臨近操作的內(nèi)存 排序。盡管如此,現(xiàn)今的x86/64,ARMv6 / v7,和PowerPC處理器架構(gòu),針對(duì)這兩種形式產(chǎn)生的機(jī)器碼應(yīng)該是一致的。在我之前的博文中,我展示了C++11低階指令順序約束在ARM7中使用了 dmb指令,這和使用內(nèi)存柵欄技術(shù)產(chǎn)生的匯編代碼相一致。

上述兩種方式在Itanium平臺(tái)可能產(chǎn)生不一樣的機(jī)器碼,在Itanium平臺(tái)上,C++11標(biāo)準(zhǔn)中的 load(memory_order_acquire)可以用單CPU指令:ld.acq,而store(tmp, memory_order_release)使用st.rel就可以實(shí)現(xiàn)。

在ARMv8處理器架構(gòu)中,也提供了和Itanium指令等價(jià)的ldar 和 stlr 指令,而不同的地方是:這些指令還會(huì)導(dǎo)致stlr和后續(xù)ldar之間進(jìn)一級(jí)的存儲(chǔ)裝載指令進(jìn)行排序。實(shí)際上,ARMv8的新指令試圖實(shí)現(xiàn)C++11標(biāo)準(zhǔn)中 的順序約束原子操作,這會(huì)在后面進(jìn)一步講述。

使用C++順序一致的原子操作

C++11標(biāo)準(zhǔn)提供了一個(gè)不同的方式來(lái)編寫無(wú)鎖程序(可以把雙重檢查鎖定歸類為無(wú)鎖編程的一種,因?yàn)椴皇撬芯€程都會(huì)獲取鎖)。在所有原子操作庫(kù)方 法中使用可選參數(shù)std::memory_order可以使得所有原子變量變?yōu)轫樞虻脑硬僮鳎╯equentially consistent),方法的默認(rèn)參數(shù)為std::memory_order_seq_cst。使用順序約束(SC)原子操作庫(kù),整個(gè)函數(shù)執(zhí)行都將保證 順序執(zhí)行,并且不會(huì)出現(xiàn)數(shù)據(jù)競(jìng)態(tài)(data races)。順序約束(SC)原子操作和JAVA5版本之后出現(xiàn)的volatile變量很相似。

使用SC原子操作實(shí)現(xiàn)雙重檢查鎖定的代碼如下:和前面的例子一樣,高亮的第二行會(huì)與***次創(chuàng)建單件的線程進(jìn)行同步與操作。

  1. std::atomic<Singleton*> Singleton::m_instance; 
  2. std::mutex Singleton::m_mutex; 
  3.   
  4. Singleton* Singleton::getInstance() { 
  5.     Singleton* tmp = m_instance.load(); 
  6.     if (tmp == nullptr) { 
  7.         std::lock_guard<std::mutex> lock(m_mutex); 
  8.         tmp = m_instance.load(); 
  9.         if (tmp == nullptr) { 
  10.             tmp = new Singleton; 
  11.             m_instance.store(tmp); 
  12.         } 
  13.     } 
  14.     return tmp; 

順序約束(SC)原子操作使得開發(fā)者更容易預(yù)測(cè)代碼執(zhí)行結(jié)果,不足之處在于使用順序約束(SC)原子操作類庫(kù)的代碼效率要比之前的例子低一些。例如,在x64位機(jī)器上,上述代碼使用Clang3.3優(yōu)化后產(chǎn)生如下匯編代碼:

x64-double-checked-seq-cst

由于使用了順序約束(SC)原子操作類庫(kù),變量m_instance的存儲(chǔ)操作使用了xchg指令,在x64處理器上相當(dāng)于一個(gè)內(nèi)存柵欄操作。該指 令在x64位處理器是一個(gè)長(zhǎng)周期指令,使用輕量級(jí)的mov指令也可以完成操作。不過(guò),這影響不大,因?yàn)閤chg指令只被單件創(chuàng)建過(guò)程調(diào)用一次。

不過(guò),在PowerPC or ARMv6/v7處理器上編譯上述代碼,產(chǎn)生的匯編操作要糟糕得多,具體情形可以參見Herb Sutter的演講(atomic Weapons talk, part 2.00:44:25 – 00:49:16)。

#p#

使用C++11數(shù)據(jù)順序依賴原理

上面的例子都是使用了創(chuàng)建單件線程和使用單件其他線程之間的同步與關(guān)系。守衛(wèi)的是數(shù)據(jù)指針單個(gè)元素,開銷也是創(chuàng)建單件內(nèi)容本身。這里,我將演示一種使用數(shù)據(jù)依賴來(lái)保護(hù)防衛(wèi)的指針。

在使用數(shù)據(jù)依賴時(shí)候,上述例子中都使用了一個(gè)讀-獲取操作,這也會(huì)產(chǎn)生性能消耗,我們可以使用消費(fèi)指令來(lái)進(jìn)一步優(yōu)化。消費(fèi)指令(consume instruction)非常酷,在PowerPc處理器上它使用了lwsync指令,在ARMv7處理器上則編譯為dmd指令。今后我會(huì)寫一些文章來(lái)講 述消費(fèi)指令和數(shù)據(jù)依賴機(jī)制。

使用C++11靜態(tài)初始化

一些讀者可能已經(jīng)知道C++11中,你可以跳過(guò)之前的檢查過(guò)程而直接得到線程安全的單件。你只需要使用一個(gè)靜態(tài)初始化:

C++11標(biāo)準(zhǔn)在6.7.4節(jié)中規(guī)定:

如果指令邏輯進(jìn)入一個(gè)未被初始化的聲明變量,所有并發(fā)執(zhí)行應(yīng)當(dāng)?shù)却瓿稍撟兞客瓿沙跏蓟?/p>

上述操作在編譯時(shí)由編譯器保證。雙重檢查鎖定則可以利用這一點(diǎn)。編譯器并不保證會(huì)使用雙重檢查鎖定,但是大部分編譯器會(huì)這樣做。gcc4.6使用-std=c++0x編譯選項(xiàng)在ARM處理器產(chǎn)生的匯編代碼如下:

clang-arm-static-init

由于單件使用的是一個(gè)固定地址,編譯器會(huì)使用一個(gè)特殊的防衛(wèi)變量來(lái)完成同步。請(qǐng)注意這里,在初始化變量讀操作時(shí)沒(méi)有使用dmb指令來(lái)獲取一個(gè)內(nèi)存柵 欄。守衛(wèi)變量指向了單件,因此編譯器可以使用數(shù)據(jù)依賴原則來(lái)避免使用dmb指令的開銷。__cxa_guard_release指令扮演了一個(gè)寫-釋放來(lái) 解除變量守衛(wèi)。一旦守衛(wèi)柵欄被設(shè)置,這里存在一個(gè)指令順序強(qiáng)制在讀-消費(fèi)操作之前。這里和前面的例子一樣,對(duì)內(nèi)存排序的進(jìn)行適應(yīng)性的變更。

前面的長(zhǎng)篇累牘主要講述了C++11標(biāo)準(zhǔn)修復(fù)了雙層檢查鎖定實(shí)現(xiàn),并且講述了其他一些相關(guān)知識(shí)。

就我個(gè)人而言,我認(rèn)為應(yīng)當(dāng)在程序初始化時(shí)就初始化一個(gè)singleton。使用雙重檢查鎖定可以幫你將任意數(shù)據(jù)類型存儲(chǔ)在一個(gè)無(wú)鎖的哈希表中。這會(huì)在后續(xù)的文章進(jìn)一步闡述。

原文鏈接:http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/

譯文鏈接:http://blog.jobbole.com/52164/

責(zé)任編輯:陳四芳 來(lái)源: 伯樂(lè)在線
相關(guān)推薦

2013-12-23 09:48:43

C++鎖定模式

2011-04-20 10:07:15

2016-11-11 00:33:25

雙重檢查鎖定延遲初始化線程

2020-06-01 21:07:33

C11C++11內(nèi)存

2025-04-30 10:10:00

在 C++C++11Lambda

2020-07-27 10:40:35

C++11語(yǔ)言代碼

2013-05-30 00:49:36

C++11C++條件變量

2024-05-29 13:21:21

2021-10-09 06:42:43

Windows 11WinRAR微軟

2025-08-01 02:11:00

2013-09-25 14:20:46

2024-02-21 23:43:11

C++11C++開發(fā)

2011-10-13 10:21:01

C++

2024-10-12 21:13:57

2021-06-11 10:53:40

Folly組件開發(fā)

2012-12-25 10:52:23

IBMdW

2013-07-31 11:09:05

C++11

2025-01-21 08:02:03

2020-12-09 10:55:25

ArrayvectorLinux

2013-12-11 10:00:14

C++新特性C
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

热久久免费视频精品| 男人资源在线播放| 伊人在我在线看导航| 精品动漫av| 97久久久精品综合88久久| 国产丝袜一区二区三区免费视频| 亚洲黄色成人久久久| 日韩视频在线免费看| 国产哺乳奶水91在线播放| 欧美精品momsxxx| 亚洲午夜羞羞片| 国产中文字幕亚洲| www.av天天| 九色porny丨国产首页在线| 麻豆免费精品视频| 亚洲性69xxxbbb| 欧美色图色综合| 亚洲乱码在线观看| 亚洲精品aaaaa| 亚洲一区在线观看免费| 久久国产主播精品| 国产一级中文字幕| 网站一区二区| 亚洲免费大片在线观看| 国产日韩欧美在线看| 久草视频免费在线| 欧美电影在线观看一区| 综合久久久久久| 国产成人精品视频| 37p粉嫩大胆色噜噜噜| 九色porny丨首页入口在线| 国产精品亲子伦对白| 琪琪亚洲精品午夜在线| 九九热视频在线免费观看| 国产一区二区主播在线| 久久久激情视频| 国产精品极品美女在线观看免费| 添女人荫蒂视频| 成人国产电影在线观看| 国产老肥熟一区二区三区| 少妇高潮久久77777| 欧美一级视频在线| 色呦呦视频在线观看| 国产精品一区在线| 国产精品一区二区三区在线播放 | 国产一区二区三区无遮挡 | 欧美中文在线视频| 久久午夜无码鲁丝片| 亚洲五码在线| 亚洲国产一区二区视频| 一区二区视频在线免费| 国产又大又黑又粗| 欧美深夜福利| 亚洲成色777777女色窝| 国产一区二区在线视频播放| av片在线观看永久免费| 中文字幕中文字幕一区| 成人av在线网址| 久久精品视频6| 欧美aⅴ99久久黑人专区| 日韩欧美亚洲另类制服综合在线 | 三上悠亚 电影| 羞羞网站在线看| 综合久久给合久久狠狠狠97色| 午夜精品视频在线观看一区二区| 国产又大又长又粗| 久国产精品韩国三级视频| 久久999免费视频| 久久精品综合视频| 另类图片第一页| 欧美色区777第一页| 国产性生活免费视频| 欧美人体大胆444www| 精品写真视频在线观看| 91av视频在线| a一级免费视频| 久久中文亚洲字幕| 日韩精品中文字幕在线播放| 国产xxxx视频| 色8久久久久| 婷婷久久综合九色综合绿巨人| 欧美性bbwbbwbbwhd| 国产三级伦理片| 久久成人在线| 欧美激情二区三区| 久久精品一区二区三区四区五区| 欧美电影一区| 欧美大尺度在线观看| 中日韩精品一区二区三区| 亚洲精品一级二级三级| 国产亚洲欧洲在线| 粉嫩av性色av蜜臀av网站| 偷拍视屏一区| 欧美本精品男人aⅴ天堂| 欧美精品第三页| 精品福利在线| 色综合视频在线观看| 欧美一级视频在线播放| 欧美成人hd| 亚洲一区中文日韩| 久久国产乱子伦免费精品| 亚洲精品天堂| 懂色av一区二区三区| 亚洲天堂第一区| 欧美极品视频| 亚洲色图欧美偷拍| 日韩理论片在线观看| www.久久成人| 久久99国产精品久久99果冻传媒| 亚洲最大福利视频网| 97精品人妻一区二区三区在线| 麻豆精品网站| 91精品在线播放| 在线免费看91| 免费观看久久久4p| 国产精品国语对白| 亚洲成人77777| 国产亚洲1区2区3区| 国产有色视频色综合| 成人亚洲综合天堂| 久久婷婷一区二区三区| 成人黄动漫网站免费| 国产xxxx孕妇| 国产欧美日韩另类一区| 日本一区二区精品| 国产在线视频网| 欧美激情在线一区二区| 国产在线视频在线| 国产亚av手机在线观看| 一区二区三区鲁丝不卡| 日本大胆人体视频| 99久久精品一区二区成人| 在线视频你懂得一区二区三区| 激情六月丁香婷婷| 视频一区日韩精品| 91精品在线一区二区| 亚洲欧美国产精品久久久久久久 | 91精品久久久久久蜜桃| 可以免费看污视频的网站在线| 亚洲精品乱码久久久久久久久| 一区二区免费在线观看| av片在线看| 国产精品私人影院| 熟妇熟女乱妇乱女网站| 性爱视频在线播放| 欧美卡1卡2卡| 国产xxx在线观看| 极品尤物一区| 欧美理论片在线观看| 一级片在线观看视频| 欧美经典一区二区三区| 男人搞女人网站| 亚州精品国产| 中文字幕日韩有码| 国产极品国产极品| 国产一区二区久久| 黄色99视频| 电影在线一区| 亚洲人成人一区二区在线观看| 国内外成人免费激情视频| 欧美天堂一区二区| 这里只有精品在线观看| 黄色片视频免费| 日韩电影在线免费观看| 国产免费一区二区三区在线观看| 亚洲欧美日韩成人在线| 久久久久久久电影| 国产美女在线一区| 久久婷婷五月综合色丁香| 亚洲乱码一区av黑人高潮| 国产无遮挡裸体免费视频| 粉嫩av一区二区三区粉嫩| 好吊色欧美一区二区三区四区 | 亚洲欧美福利视频| 黑人一级大毛片| 欧美三区视频| 成人在线激情视频| a√资源在线| 欧美高清视频www夜色资源网| 久久久久久久久福利| 亚洲人成网www| 欧美专区福利在线| 天天操天天干天天爱| 国产精品久久久久影视| 九九九在线观看视频| 俺要去色综合狠狠| 亚洲精品视频免费在线观看| 无码人妻丰满熟妇奶水区码| 久久日一线二线三线suv| 久久久久免费精品| 992tv人人草| 国产一级片在线播放| 在线观看日韩电影| 男人天堂资源网| 国产主播一区| 国产精品成人一区二区三区吃奶| 亚洲色大成网站www| 一本色道久久综合亚洲aⅴ蜜桃| 国产制服丝袜在线| 日韩电影在线免费观看| 亚洲国产精品影视| 午夜精品福利影院| 国产精品亚洲网站| 怡红院av在线| 亚洲欧美激情四射在线日| 国产剧情精品在线| 婷婷综合在线观看| 亚洲av无一区二区三区| av不卡在线看| 日本久久精品视频| 青青草超碰在线| 亚洲激情图片小说视频| 亚洲图片欧美另类| 99久久99热这里只有精品 | 免费黄色片网站| 奇米一区二区三区| 日韩电影在线播放| 国产成年精品| 一色桃子一区二区| av资源免费观看| 国产欧美一区二区精品性| 无码人妻久久一区二区三区蜜桃| 国产日韩欧美三级| 国产三区精品| 成人涩涩视频| 久久久久久久97| 国产激情视频在线播放| 欧美性猛交xxxx富婆| 欧美熟妇精品一区二区蜜桃视频 | 日韩欧美在线免费观看视频| 亚洲最大黄网| 1769国产精品| 中文在线免费| 一区二区三区在线播放欧美| 亚洲奶汁xxxx哺乳期| 欧美三级电影网站| 性色av免费观看| 99视频精品在线| 国产原创精品在线| 99精品综合| 欧美日韩精品免费观看视一区二区| 精品伊人久久| 国产精品视频中文字幕91| 亚洲va中文在线播放免费| 日韩久久精品成人| www.爱爱.com| 欧美乱熟臀69xxxxxx| 国产成人av免费| 国产日韩欧美在线一区| 国产精品一区二区人妻喷水| 久久97超碰国产精品超碰| 九色91popny| 日韩和欧美一区二区| 69堂免费视频| 精品91在线| 色狠狠久久av五月综合| 亚洲资源网站| 韩日午夜在线资源一区二区 | 国产精品剧情| 欧美精品日韩一本| 波多野结衣av无码| 亚洲视频在线一区观看| 美国美女黄色片| 99国产精品一区| 国产三级视频网站| 久久嫩草精品久久久精品| 国产熟妇搡bbbb搡bbbb| av在线一区二区三区| 在线观看亚洲免费视频| 亚洲黄色天堂| 国产一级做a爰片久久毛片男| 欧美电影三区| 日本美女爱爱视频| 欧美日本免费| 日韩激情视频一区二区| 欧美日韩1区2区3区| 免费网站在线观看视频 | 三区精品视频观看| 久久精品国产www456c0m| 亚洲精品一区二区毛豆| 久久伦理在线| 国产亚洲精品久久久久久久| 国产手机视频一区二区| 欧美 日韩精品| 日日嗨av一区二区三区四区| 亚洲精品怡红院| 国产激情视频一区二区在线观看 | 久久精品123| www.国产区| 国产一区二区电影| 国产女人18毛片水真多18| 久久夜色精品一区| 免费视频91蜜桃| 亚洲一区二区高清| 五月天婷婷激情| 欧美视频在线观看一区二区| 成人小视频在线播放| 日韩欧美黄色影院| 亚洲av成人无码网天堂| 亚洲网址你懂得| 在线免费观看黄色av| 久久久久久久影院| 精品成人免费一区二区在线播放| 成人性生交xxxxx网站| 欧美一级色片| 91久久精品国产| 91精品短视频| 欧美精品一区二区三区久久| 三级小说欧洲区亚洲区| 中文字幕一区二区三区乱码| 亚洲午夜伦理| 国产三级日本三级在线播放| 国产成人午夜视频| 精品人伦一区二区三电影| 亚洲国产成人午夜在线一区| 欧美激情一区二区视频| 亚洲一二三区视频在线观看| 国产第一页在线观看| 日韩你懂的在线播放| 女人偷人在线视频| 久久久久久久久久久人体| 岛国精品在线| 韩国精品一区二区三区六区色诱| 美女网站一区| 少妇高潮喷水在线观看| 黄色一区二区三区四区| 亚洲 欧美 日韩系列| 国产91丝袜在线播放0| 九九九视频在线观看| 亚洲成人你懂的| 亚洲天堂网在线视频| 亚洲女人被黑人巨大进入| 91精品国产91久久久久久青草| 欧美做受高潮电影o| 日韩欧美另类中文字幕| 中文字幕中文字幕在线中一区高清 | 欧美一区二区大片| 国产一区电影| 久久久久久久久国产精品| 国产精区一区二区| 一区二区免费在线视频| 亚洲免费一区二区| 天堂久久久久久| 亚洲午夜久久久久久久久久久 | 瑟瑟在线观看| 中文国产亚洲喷潮| аⅴ资源天堂资源库在线| 成人一区二区电影| 欧美日韩久久精品| 无码日韩人妻精品久久蜜桃| 国产精品自在在线| 久久高清内射无套| 亚洲免费在线视频| 欧美 亚洲 另类 激情 另类| 国产一区二区女| 三级网站在线免费观看| 国产精品视频一二三区| 特一级黄色大片| 日本精品一区二区三区四区的功能| www.av网站| xxx一区二区| 97蜜桃久久| 高清国产在线一区| 欧美成人基地| 国产精品入口芒果| 99精品黄色片免费大全| 日韩免费一级片| 日韩久久免费av| xxxx成人| 国产免费一区二区| 影音国产精品| 30一40一50老女人毛片| 一本久久a久久精品亚洲| 黄色电影免费在线看| 国产日韩综合一区二区性色av| 日韩片欧美片| 亚洲中文字幕无码一区二区三区| 韩国精品免费视频| 久久精品国产亚洲AV无码麻豆| 日韩一级欧美一级| 麻豆国产在线播放| 国产成人综合亚洲| 久久久久久久久久久久久久| 激情图片中文字幕| 一卡二卡欧美日韩| 日韩大胆视频| 国产精品第三页| 日韩欧美伦理| 久久久久无码国产精品一区李宗瑞| 亚洲一区电影777| 欧美成人免费| 亚洲v日韩v综合v精品v| 国产探花一区在线观看| 18禁裸男晨勃露j毛免费观看| 成人国产在线观看| 日韩欧美国产另类| 精品国内产的精品视频在线观看| 亚洲天堂av资源在线观看| 久久精品99国产| 成人欧美一区二区三区视频网页|