日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

std map多线程_SEBR:多线程内存回收方案(1)之ConcurrentHasMap

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。