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

世界上最簡單的無鎖哈希表

開發(fā) 后端
無鎖哈希表(Lock-Free Hash Table )可以提高多線程下的性能表現(xiàn),但是因為實現(xiàn)一個無鎖哈希表本身的復(fù)雜度不小。

無鎖哈希表(Lock-Free Hash Table )可以提高多線程下的性能表現(xiàn),但是因為實現(xiàn)一個無鎖哈希表本身的復(fù)雜度不小。(ps:真正的復(fù)雜在于出錯之后的調(diào)試,因為多線程下的調(diào)試本身就很復(fù)雜,引入無鎖數(shù)據(jù)結(jié)構(gòu)之后,傳統(tǒng)的看堆棧信息和打印log都基本上沒有意義了。堆棧中的數(shù)據(jù)可能被并發(fā)訪問破壞,而打印log本身可能會改變程序執(zhí)行時對數(shù)據(jù)訪問的時序。一個比較可行的做法是實現(xiàn)一個無鎖版本和一個傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)+鎖的版本,出錯后通過替換來定位是無鎖數(shù)據(jù)結(jié)構(gòu)本身的bug還是其他邏輯的 bug)。所以對一個項目而言,無鎖數(shù)據(jù)結(jié)構(gòu)基本上是一把雙刃劍。

據(jù)我所知,***個用于實際開發(fā)的無鎖哈希表是 Dr. Cliff Click 為Java而寫。在2007年他發(fā)布了這個無鎖哈希表的源碼并且在google做了關(guān)于它的報告(視頻)。我承認,在我***次看這個報告的時候,我對它的大部分內(nèi)容都不理解。Dr. Cliff Click是這個領(lǐng)域的先驅(qū)。(Maged M. Michael 在IBM做了大量關(guān)于無鎖數(shù)據(jù)結(jié)構(gòu)的研究。這個是2002年的一篇論文,關(guān)于哈希表,http://www.research.ibm.com/people/m/michael/spaa-2002.pdf)

很幸運,6年時間足夠我理解Dr. Cliff Click所做的研究。事實上,你不必做一些前沿的探索,去實現(xiàn)一個***的無鎖哈希表。在這里我將分享我實現(xiàn)的這個版本。我相信有使用C++進行多線程開發(fā)經(jīng)驗的程序員,可以通過這篇博客梳理以前的經(jīng)驗,并且完全理解它。

約束

作為一個程序員,平時我們實現(xiàn)一個數(shù)據(jù)結(jié)構(gòu)會本能的盡可能通用。這不是一件壞事,但是當我們把通用當作一個更重要的目標時,它可能會阻礙我們。在這里我走向另一個極端,實現(xiàn)了一個盡可能簡單的,僅用于一些特殊環(huán)境的哈希表,下面是它的設(shè)計約束:

  1. table 只接受類型為32位整數(shù)的key和value

  2. 所有key必須非零

  3. 所有的value必須非零

  4. table的***數(shù)目固定且必須是2的冪

  5. 唯一可用的操作是SetItem和getItem

  6. 有沒有刪除操作

當然你掌握了這種算法實現(xiàn)機制之后,可以在此基礎(chǔ)上進行擴展,而不受這些限制的約束。(rehash,刪除和遍歷,這些都會增加復(fù)雜度,而且有引發(fā)新的ABA問題的可能性)。

實現(xiàn)方法

有很多種方法來實現(xiàn)一個哈希表。這里我選擇了用我以前的帖子中描述的ArrayOfItems類做一個簡單的修改,(前置擴展閱讀) A Lock-Free… Linear Search?

這個哈希表被我稱為HashTable1,和ArrayOfItems一樣,它采用了一個巨大的key-value pairs數(shù)組實現(xiàn)。

  1. struct Entry  
  2. {  
  3.     mint_atomic32_t key;  
  4.     mint_atomic32_t value;  
  5. };  
  6. Entry *m_entries;  

在hashtable1中,僅僅只有數(shù)組本身而沒有使用鏈接來處理碰撞。數(shù)組全部初始化為0,key為0時對應(yīng)的節(jié)點為空。插入時,會通過線性搜索找到一個空節(jié)點。

ArrayOfItems和HashTable1之間唯一的區(qū)別是,ArrayOfItems是從0開始做線性搜索,而HashTable1使用MurmurHash3′s integer finalizer算法得到一個hash值,然后以這個hash值為起點開始搜索()

  1. inline static uint32_t integerHash(uint32_t h) 
  2.     h ^= h >> 16; 
  3.     h *= 0x85ebca6b; 
  4.     h ^= h >> 13; 
  5.     h *= 0xc2b2ae35; 
  6.     h ^= h >> 16; 
  7.     return h; 

當我們使用相同的key做參數(shù)調(diào)用SetItem或GetItem方法時,它會在相同的index開始做線性搜索,而使用不同的key時,會在不同的 index開始搜索。通過這種方式,可以提高查找到對應(yīng)key所在節(jié)點的速度,并且保證多線程并發(fā)調(diào)用SetItem或GetItem的安全性。

HashTable1采用環(huán)形的搜索,當搜索到尾部時,會從數(shù)組頭部開始繼續(xù)搜索。在數(shù)組滿之前,每次搜索都可以保證返回對應(yīng)key所在的節(jié)點,或者是一個空節(jié)點。這種技巧被稱為open addressing with linear probing,,在我看來這無疑是對lock-free最友好的hash算法,事實上在Dr. Cliff Click為java實現(xiàn)的哈希表中也使用了相同的技巧。

 

代碼

SetItem的實現(xiàn)。它會掃描整個數(shù)組并且將value保存在與key對應(yīng)的節(jié)點或空節(jié)點。這段代碼與ArrayOfItems:: SetItem幾乎相同,唯一的區(qū)別是計算了hash值并且按位與,保證index在數(shù)組邊界內(nèi)。

  1. void HashTable1::SetItem(uint32_t key, uint32_t value) 
  2.     for (uint32_t idx = integerHash(key);; idx++) 
  3.     { 
  4.         idx &= m_arraySize - 1; 
  5.   
  6.         uint32_t prevKey = mint_compare_exchange_strong_32_relaxed(&m_entries[idx].key, 0, key); 
  7.         if ((prevKey == 0) || (prevKey == key)) 
  8.         { 
  9.             mint_store_32_relaxed(&m_entries[idx].value, value); 
  10.             return
  11.         } 
  12.     } 

GetItem的實現(xiàn)也同樣和ArrayOfItems::GetItem有類似的改變。

  1. uint32_t HashTable1::GetItem(uint32_t key) 
  2.     for (uint32_t idx = integerHash(key);; idx++) 
  3.     { 
  4.         idx &= m_arraySize - 1; 
  5.   
  6.         uint32_t probedKey = mint_load_32_relaxed(&m_entries[idx].key); 
  7.         if (probedKey == key) 
  8.             return mint_load_32_relaxed(&m_entries[idx].value); 
  9.         if (probedKey == 0) 
  10.             return 0;          
  11.     } 

上述功能都是線程安全的,無鎖的ArrayOfItems出于同樣的原因:對數(shù)組的元素采用原子操作,使用cas操作修改節(jié)點的key值(使用內(nèi)存柵障保證線程安全,事實上就是重新排列了內(nèi)存訪問指令的執(zhí)行次序)。在上一篇中有更詳細的討論。

***,就像在以前的帖子中,我們可以優(yōu)化SetItem,***次判斷是否可以避免使用CAS操作。如下這種優(yōu)化,可以使示例應(yīng)用程序運行快大約20%。

  1. void HashTable1::SetItem(uint32_t key, uint32_t value) 
  2.     for (uint32_t idx = integerHash(key);; idx++) 
  3.     { 
  4.         idx &= m_arraySize - 1; 
  5.   
  6.         // Load the key that was there. 
  7.         uint32_t probedKey = mint_load_32_relaxed(&m_entries[idx].key); 
  8.         if (probedKey != key) 
  9.         { 
  10.             // The entry was either free, or contains another key. 
  11.             if (probedKey != 0) 
  12.                 continue;           // Usually, it contains another key. Keep probing. 
  13.                   
  14.             // The entry was free. Now let's try to take it using a CAS. 
  15.             uint32_t prevKey = mint_compare_exchange_strong_32_relaxed(&m_entries[idx].key, 0, key); 
  16.             if ((prevKey != 0) && (prevKey != key)) 
  17.                 continue;       // Another thread just stole it from underneath us. 
  18.   
  19.             // Either we just added the key, or another thread did. 
  20.         } 
  21.           
  22.         // Store the value in this array entry. 
  23.         mint_store_32_relaxed(&m_entries[idx].value, value); 
  24.         return
  25.     } 

這個就是幾乎可以精簡的最簡單的無鎖哈希表,這里是它的代碼鏈接: source and header。

一個忠告:與ArrayOfItems一樣,HashTable1上的所有操作都采用了relaxed memory ordering做限制。因此,當在HashTable1中設(shè)置標記,共享一些數(shù)據(jù)供其他線程訪問時,必須事先插入release fence。同樣訪問數(shù)據(jù)的線程在調(diào)用GetItem前需要acquire fence。

  1. // Shared variables 
  2. char message[256]; 
  3. HashTable1 collection; 
  4.   
  5. void PublishMessage() 
  6.     // Write to shared memory non-atomically. 
  7.     strcpy(message, "I pity the fool!"); 
  8.       
  9.     // Release fence: The only way to safely pass non-atomic data between threads using Mintomic. 
  10.     mint_thread_fence_release(); 
  11.       
  12.     // Set a flag to indicate to other threads that the message is ready. 
  13.     collection.SetItem(SHARED_FLAG_KEY, 1) 

簡單樣例

對HashTable1的一些測試對比,在上一篇帖子我做個一個類似的測試。它交替執(zhí)行2個測試:一個采用2個線程,每個線程交替插入6000個key不同的item,另一個每個線程交替插入12000個key相同但是value不同的item。

 

代碼放在GitHub上,你可以自己編譯和執(zhí)行。編譯說明見README.md

在HashTable1沒有滿時—少于80%時—HashTable1表現(xiàn)的很好,我也許應(yīng)該為這個說法做一些基準測試。但是以以往的常規(guī)的哈希表 作為基準,我敢肯定你很難實現(xiàn)出性能更好的無鎖哈希表。這似乎奇怪,HashTable1基于ArrayOfItems,看起來會很低效。當然,任何哈希 表中,總會有發(fā)生碰撞的風(fēng)險,而降階到ArrayOfItems的風(fēng)險并不為0。但是使用一個足夠大的數(shù)組和類似MurmurHash3這樣的hash函 數(shù),這種情況出現(xiàn)的很少。

在實際的工作中,我已經(jīng)使用了一個和這個類似的hash-table。這是一個游戲開發(fā)的項目,我的工作是解決使用內(nèi)存分配跟蹤工具(memory tracker)之后對一個讀寫鎖激烈的爭用。遷移到無鎖哈希表的過程非常棘手。相對HashTable1需要更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),key和value都是 指針而不是簡單的整數(shù)。因此有必要在哈希表內(nèi)部插入memory ordering。最終在此模式下運行:最壞情況下游戲的幀率提高了4-10 FPS。

原文鏈接:http://preshing.com/20130605/the-worlds-simplest-lock-free-hash-table

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

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

2018-11-06 12:22:18

排序算法代碼

2023-07-31 08:59:46

軟件FossilSQLite

2014-09-05 09:08:58

2010-09-02 13:21:46

2013-04-24 09:57:08

Excel微軟

2025-03-27 00:45:00

2025-03-13 00:35:00

2015-11-25 09:41:05

數(shù)據(jù)中心

2014-02-11 09:58:19

環(huán)保數(shù)據(jù)中心泰坦

2013-07-09 10:11:41

程序設(shè)計大賽程序員

2025-10-10 03:00:00

2024-10-14 10:58:13

2025-11-11 02:55:00

OracleJavaScriptES5

2024-01-11 09:11:08

數(shù)據(jù)庫SQLite管理

2025-01-09 11:10:15

2024-07-15 09:06:51

2018-12-04 15:46:53

編程語言Python

2013-05-08 09:38:28

InteropNetSDN網(wǎng)絡(luò)設(shè)備供應(yīng)商

2018-07-19 19:07:33

語言編程語言程序

2009-09-11 10:41:36

數(shù)據(jù)中心
點贊
收藏

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

亚洲综合男人的天堂| 国模一区二区三区白浆| 亚洲欧美日韩国产精品| 热久久精品国产| 黄网站免费在线观看| 国产成人亚洲综合a∨婷婷图片| 久久免费精品日本久久中文字幕| 可以直接看的无码av| 欧美激情不卡| 欧美日韩国产在线看| 中文视频一区视频二区视频三区 | 欧美性色xo影院| 亚洲一区二区精品在线| 欧美一区二区三区激情| 久久激五月天综合精品| 性欧美长视频免费观看不卡| 69xxx免费| 精品亚洲自拍| 91精品国产综合久久国产大片| 国产精品秘入口18禁麻豆免会员| 黄av在线播放| 国产拍欧美日韩视频二区| 成人欧美一区二区| 97人妻精品一区二区三区软件 | 欧美激情一二三| 成年人在线免费看片| 激情小说亚洲色图| 欧美一二三四在线| 99热这里只有精品在线播放| 黄视频网站在线观看| 亚洲欧美另类久久久精品2019| 明星裸体视频一区二区| 国产91绿帽单男绿奴| 一区二区三区网站| 国产亚洲欧美一区| 欧美熟妇精品一区二区蜜桃视频| 91视频成人| 在线一区二区三区四区| 国产黄页在线观看| www.超碰在线| 亚洲妇女屁股眼交7| 国产女主播av| 成人短视频在线观看| 中文一区在线播放| 视频一区二区综合| 国产精品四虎| 国产三级精品视频| 成人网在线免费观看| 91视频在线视频| 久热精品在线| 国产激情久久久| 久久久久久无码精品大片| 久久精品导航| 日本韩国欧美精品大片卡二| 国产无套丰满白嫩对白| 欧美亚洲三级| 国产国语刺激对白av不卡| 国产第一页在线观看| 日韩电影在线一区| 国产精品一区二区久久久| 中文字幕一二三四| 麻豆国产精品官网| 91免费欧美精品| 国产v在线观看| 成人妖精视频yjsp地址| 国产精品视频500部| 手机看片一区二区| 91美女在线观看| 日韩亚洲视频在线| 欧美jizzhd69巨大| 一区二区高清视频在线观看| 99久re热视频精品98| а天堂中文在线官网| 亚洲综合成人在线| 欧美亚洲一二三区| 99久久伊人| 5858s免费视频成人| 无码人妻一区二区三区一| 亚洲综合影院| 亚洲精品成人久久| 丰满的亚洲女人毛茸茸| 91精品一区二区三区综合在线爱| 欧美多人爱爱视频网站| 国产成人无码精品亚洲| 日本欧美在线观看| 亚洲xxxx在线| 欧美在线一卡| 最近日韩中文字幕| 欧美牲交a欧美牲交| 精品国产欧美日韩一区二区三区| 91精品国产91热久久久做人人| 久久久久久久穴| 国产精品免费大片| 欧美丰满片xxx777| 国产剧情在线视频| 国产精品一二三区在线| 欧美激情论坛| 少女频道在线观看高清| 色av综合在线| 国产精品19p| 精品国产乱码久久久久久果冻传媒| 日韩最新av在线| 日韩毛片在线播放| 国产最新精品精品你懂的| 精品婷婷色一区二区三区蜜桃| 1024免费在线视频| 亚洲成av人片一区二区梦乃 | 久草在线在线精品观看| 国产亚洲福利社区| 黄网页在线观看| 欧美在线不卡一区| 国产精品久久久免费观看| 色综合五月天| 日产精品久久久一区二区福利| www久久久久久| 中文av一区二区| 妺妺窝人体色www在线小说| 成年永久一区二区三区免费视频| 亚洲欧美视频在线观看视频| 男人操女人逼免费视频| 国产精品一区二区精品视频观看| 亚洲美女av黄| 日韩av电影网址| 国产精品18久久久久久vr| 日韩在线观看电影完整版高清免费| 丁香花高清在线观看完整版| 在线播放日韩导航| 山东少妇露脸刺激对白在线| 国产麻豆综合| 国产欧美一区二区在线播放| av在线网址观看| 91精品国产综合久久精品app| 第一次破处视频| 欧美一级网站| 九九九九九九精品| 成年人视频网站免费观看| 人在线成免费视频| 精品福利一区二区三区| 黄色片子在线观看| 久久福利资源站| 亚洲精品电影在线一区| 电影亚洲精品噜噜在线观看| 亚洲女同精品视频| 五月天婷婷丁香| 不卡一区中文字幕| 国产自产在线视频| 极品束缚调教一区二区网站| 久久久久久久国产精品视频| 亚洲女同志亚洲女同女播放| 一区二区三区在线不卡| 日本美女久久久| 亚洲女同中文字幕| 亚洲在线第一页| 亚洲欧美成人影院| 欧美mv日韩mv| 91蜜桃视频在线观看| 91亚洲精品久久久蜜桃网站| 日韩极品视频在线观看 | 欧美日韩高清一区二区不卡| 97超碰青青草| 美女少妇全过程你懂的久久| 欧美一级黑人aaaaaaa做受| 日本大臀精品| 日本乱人伦aⅴ精品| 成熟人妻av无码专区| 免费观看一级特黄欧美大片| 一区二区三区四区在线视频| 成人动漫视频在线观看| 欧美高清视频一区二区| 少妇无码一区二区三区| 日韩欧美一区二区三区| 日韩欧美黄色网址| 韩国av一区二区三区在线观看 | 在线观看亚洲| 欧美视频观看一区| 日韩一区二区三免费高清在线观看| 久久激情视频久久| 好吊视频一二三区| 色综合久久久久综合99| 亚洲 欧美 国产 另类| 国产精品一级黄| 亚洲中文字幕无码不卡电影| 成人羞羞动漫| 丁香婷婷久久久综合精品国产| 女人让男人操自己视频在线观看| 在线亚洲午夜片av大片| www.色婷婷.com| 一道本成人在线| 日本精品在线免费观看| av电影在线观看不卡| 91极品视频在线观看| 伊人久久亚洲影院| 婷婷五月色综合| 色播一区二区| 国产91露脸中文字幕在线| 性xxxfreexxxx性欧美| 亚洲精品在线视频| 国产免费叼嘿网站免费| 欧美日韩一区二区在线 | 日韩欧美精品中文字幕| 黄色录像二级片| 久久精品水蜜桃av综合天堂| 手机看片国产精品| 日韩在线一区二区| 成人黄色大片网站| 欧美好骚综合网| 欧美三级网色| 久久影视三级福利片| 国产欧美精品一区二区三区-老狼| av在线理伦电影| 久久久国产成人精品| 精品视频二区| 精品播放一区二区| 国产精品伊人久久| 欧美在线观看你懂的| 国产又黄又爽又色| 一区二区在线观看视频| 美国黄色特级片| 久久蜜臀中文字幕| 国产精品入口麻豆| 国产精品自拍在线| 色播五月综合网| 日韩影院在线观看| 欧美精品一区免费| 在线亚洲激情| 日韩人妻无码精品久久久不卡| 91超碰成人| 亚洲一区三区电影在线观看| 亚洲男人都懂第一日本| 久久久久久九九| 欧美黑人做爰爽爽爽| 99热国产免费| 亚洲国产中文在线| 3d动漫啪啪精品一区二区免费 | 青青草原在线免费观看| 国产精品毛片大码女人| 亚洲精品乱码久久久久久久久久久久| 成人av免费在线| 手机免费看av片| 成人av网址在线观看| 人妻 日韩 欧美 综合 制服| 成人丝袜高跟foot| 国模私拍在线观看| av男人天堂一区| 国产精品无码一区二区三区免费| 成人a区在线观看| 精品久久久久久无码人妻| 国产成人精品午夜视频免费| 绯色av蜜臀vs少妇| 国产精品1区二区.| 日本不卡视频一区| 91免费国产视频网站| 欧美老熟妇乱大交xxxxx| 久久一区二区三区四区| 免费污网站在线观看| 国产婷婷精品av在线| 91禁男男在线观看| 亚洲人精品一区| 欧美人禽zoz0强交| 亚洲制服丝袜一区| 成年人免费高清视频| 色呦呦日韩精品| 一级黄色短视频| 日韩视频免费观看高清在线视频| 亚洲欧美强伦一区二区| 亚洲精品国产精品久久清纯直播| 你懂的免费在线观看视频网站| 亚洲日韩欧美视频一区| 日本高清中文字幕在线| 欧美成人免费小视频| av蜜臀在线| 国产精品久久婷婷六月丁香| 亚洲精品成a人ⅴ香蕉片| 99久久精品免费看国产一区二区三区| 91精品日本| 欧美日韩一区二区三区在线观看免| 国产精品视频一区二区三区四蜜臂| 午夜精品区一区二区三| 综合久久亚洲| 野外做受又硬又粗又大视频√| 欧美一级专区| 伊人五月天婷婷| 99视频在线观看一区三区| 91资源在线播放| 一区二区三区在线播| www.com亚洲| 日韩精品一区二区三区在线观看| 天堂av在线资源| 日韩在线观看免费高清| free性m.freesex欧美| 国产成人亚洲综合青青| 国产精品美女久久久久人| 久久精品国产一区二区三区不卡| 日韩午夜电影网| 日韩av综合在线观看| 久久成人免费日本黄色| 色噜噜在线观看| 亚洲人123区| 成人免费视频国产免费| 欧美成人一区二区三区| 成全电影播放在线观看国语| 欧美极品少妇xxxxⅹ免费视频 | 精品综合久久| 在线看片不卡| 美女喷白浆视频| 成人免费高清视频| 暗呦丨小u女国产精品| 色网站国产精品| 懂色av一区二区三区四区| 色琪琪综合男人的天堂aⅴ视频| 麻豆成全视频免费观看在线看| 国产在线观看精品一区二区三区| 天天久久夜夜| 成人精品视频在线播放| 国产在线一区观看| 四季av中文字幕| 色综合夜色一区| 人妻无码一区二区三区久久99| 久久精品一区中文字幕| 日韩毛片一区| 日韩精品一区二区三区四区五区| 亚洲自啪免费| 日本成人在线免费| 亚洲欧美日韩国产中文在线| 亚洲中文无码av在线| 亚洲精品永久免费| 中文字幕在线免费观看视频| 国产成人免费观看| 午夜性色一区二区三区免费视频| 天天爽夜夜爽一区二区三区| 久久精品水蜜桃av综合天堂| 黄色大片网站在线观看| 亚洲国产成人久久综合| 黄页网站在线| 国产精品 日韩| 亚洲黑丝一区二区| 韩国av中国字幕| 亚洲图片欧美视频| 亚洲精品字幕在线| 欧美激情免费视频| 婷婷综合国产| 青草网在线观看| 成人看片黄a免费看在线| 久久久久久激情| 欧美大片日本大片免费观看| 日韩伦理电影网站| 高清国语自产拍免费一区二区三区| 伊人情人综合网| 久久人人爽人人片| 夜夜亚洲天天久久| 韩国中文字幕hd久久精品| 久久青草精品视频免费观看| 欧美一区二区三区红桃小说| 浮妇高潮喷白浆视频| 久久综合色之久久综合| 九九热最新视频| 精品国偷自产在线| 日本精品一区二区三区在线观看视频| 亚洲精品少妇一区二区| 成人永久aaa| 特黄视频免费看| 中文字幕免费精品一区高清| 男人亚洲天堂| 免费一级淫片aaa片毛片a级| av在线这里只有精品| 波多野结衣在线观看视频| 久久九九热免费视频| 99re8这里有精品热视频免费| 可以在线看的av网站| 久久一夜天堂av一区二区三区| 中文字幕在线观看免费| 久久夜色精品国产亚洲aⅴ| 粉嫩久久久久久久极品| 黑森林福利视频导航| 亚洲欧洲精品天堂一级| 精品国产乱码一区二区三| 97国产精品视频| 成人影视亚洲图片在线| 亚洲精品乱码久久久久久9色| 精品成人国产在线观看男人呻吟| 第九色区av在线| 91一区二区三区| 视频一区欧美日韩| 一区二区视频免费看| 亚洲精品综合精品自拍| 91视频亚洲| 欧美污视频网站| 一区二区三区在线免费视频| 三级无遮挡在线观看| 91探花福利精品国产自产在线| 亚洲黄色天堂| 国产精品免费在线视频| 欧美精品一区二区三区蜜桃视频 | 性xxxxfjsxxxxx欧美| 日本高清视频一区二区三区| 国产乱人伦偷精品视频不卡| 免费视频久久久| 色综合久久中文字幕综合网小说| 国产不卡av一区二区| 一级黄色片毛片|