std map多线程_SEBR:多线程内存回收方案(1)之ConcurrentHasMap
SEBR處理多線程場景下的一般性GC問題。
為了驗證它的有效性,我根據java-1.8版之后的ConcurrentHashMap改成了一個C++的版本(好吧,真實情況是一遍設計SEBR一遍寫出這個ConcurrentHashMap)。
由于ConcurrentHashMap是為了Read-mostly設計的,所以這個ConcurrentHashMap相對于之前的版本最大的區別在于:
- 當某個bucket長度達到8,這個bucket就會二叉樹化。
- 當長度小于6又會從二叉樹轉化回鏈表。
而facebook開源的folly看起來就是參考Java1.7的版本改了改出了一個C++的版本,之前寫過它的實現采用了hazard pointers的方式。
所以新的ConcurrentHashMap算法是怎么樣的,這一方面已有很多說明源碼的資料。
用C++造一個并發數據結構比Java難很多,哪怕是直接照搬Java的實現也很難,最主要的是一般性GC問題,因為沒有一個機制去安全地刪除已經不需要的數據,而有了SEBR 我就能靈活準確地解決這個問題了。
concurrent_hash_map.hpp?github.com是C++的一個并發哈希表實現,它不是無鎖的,它提供了insert/erase/find三個接口。find接口有兩種返回值的實現,一種(find)是將value復制回來,另一種(find_reference)不復制,直接訪問哈希表中的value,這種情況下需要考慮value被刪除的可能,而通過sebr可以準確地實現這一點。
而使用sebr的方式是在通過retire調用,確保此后的線程再也拿不到這個地址。從而確保當前已經拿到該地址的線程們退出操作之后,便可以物理回收這塊內存。
g++ -std=c++17 -pthread -Wall -W -g -O3 -o test test_concurrent_hash_map.cpp
./test 2 100000 8
test_concurrent_hash_map?github.com總結
以上是生活随笔為你收集整理的std map多线程_SEBR:多线程内存回收方案(1)之ConcurrentHasMap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php mysql int string
- 下一篇: java 微信 菜单_java微信开发A