C++ 的無鎖數據結構在工業界有真正的應用嗎?


內存資料庫領域用的很多

1. MemSQL用Lock Free Skip List做索引:The Story Behind MemSQL』s Skiplist Indexes

2. SQL SERVER內存存儲引擎Hekaton用Lock Free Bw-Tree做索引:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/bw-tree-icde2013-final.pdf

3. HyPer的並行查詢引擎大量的應用了Lock Free數據結構,如使用Lock Free的Hash Table實現Hash Join:http://db.in.tum.de/~leis/papers/morsels.pdf

4. DB2 BLU的並行查詢引擎:http://db.disi.unitn.eu/pages/VLDBProgram/pdf/industry/p773-barber.pdf

5. OceanBase也大量的使用Lock Free

為什麼傳統資料庫不用呢?

因為瓶頸在磁碟,Lock Free增加的性能幾乎可以忽略不計,但是在內存資料庫中是可以大幅度提高性能的。


謝邀。

lockfree在高性能伺服器編程還是比較常見的,從目前國內IDC成本來看,同等計算能力下,減少機器數量,增加單台計算能力,成本更低,因此要盡量把單機性能發揮到極致。對於分散式資料庫來說,能在單機上完成的事務,就盡量不要走分散式事務,也需要對單機能力的極致優化。

oceanbase用的伺服器比較華麗,當初玩過最好的是4路784G 80core的機器,項目中大量用到了無鎖結構,有些單純用cas也遇到瓶頸的場景,還做了更多優化,舉幾個例子:

1.無鎖queue,用於網路線程池到工作線程池的任務分發,首先queue是無鎖的,喚醒也盡量減少了鎖的使用,有的場景甚至用了socket pair+epoll的喚醒方式。關於喚醒,這裡可玩的就很多了,以後找機會專門寫文章來討論

2.無鎖容器,b+tree,idmap,滑動窗口,可擴展的hashmap等(別找0.4代碼了,這些黑科技都沒開源),主要難點在內存管理上避免aba問題,大量使用了hazard pointer的內存回收思路

3.緩存,早期版本跑在sas盤上,用lru鏈表管理緩存,放到SSD上後,發現開啟緩存比關閉緩存QPS還更低,原因就是lru鏈表要用鎖保護造成的,這裡後來改為用無鎖的近似演算法,加引用計數來管理

4.內存池和對象池管理,tcmalloc性能達不到我們的要求,所以自己搞資源管理,根據不同的場景,內部有多個內存資源管理的結構

5.還有個有意思的,原來內存中有個讀很多寫很少的數據結構,最初用pthread讀寫鎖管理,後來發現這貨裡面有mutex可能造成讀者間的衝突,就改成自己用cas實現的讀寫鎖,後來又發現cas都在一個變數上衝突也挺大,就繼續優化,每個線程一把讀寫鎖,讀者只在線程本地加鎖,寫者要遍歷所有線程拿寫鎖

最後,推薦下自己這篇專欄文章,對於理解無鎖內存管理,有些幫助:共享變數的並發讀寫,https://zhuanlan.zhihu.com/p/20832611


推薦閱讀:

做遊戲與搞圖形學有什麼聯繫?
既然 C++ 是 C 的超集,為什麼還是有不少人認為 C++ 不如 C?
為什麼 C# 的語法特性並不比 C++ 簡單,但編譯速度卻比C++快那麼多?
學C++真的需要看那麼多書嗎?
既然建議盡量避免使用goto語句為何C++還要支持goto呢?

TAG:C | 數據結構 | 多線程 |