Lock-Free Data Structures with Hazard Pointers筆記

Andrei Alexandrescu神文,地址在這裏:http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/2004/0412/0412alexandrescu/0412alexandrescu.html

接上一篇文章,使用引用計數實現WRRM map最後卻會變成Write-Rarely-Read-Many-But-Not-Too-Many Map。這篇文章引入hazard pointers,大意是每個讀線程會在讀取時獲取一次hazard pointer保存在全局鏈表中,而更新線程則每次把舊的map放到Retire list中(Thread local)。當retire list中元素數量超過R時,掃描retire list,對於不在hazard pointer列表中的map才進行回收。
R取多少?較好的選擇是(1+k)*H,H是hazard pointer列表長度,k爲常數,如1/4。hazard pointer list如果使用哈希表,每次scan的複雜度爲O(R)。注意在look的acquire調用之後要recheck pMap_。
如果要讓lookup操作變爲wait free,可以使用陷阱技術(trap technique)(基於hazard pointer).
通用性較好,HRecType結構使用void*,所有結構都可以只用一套hazard pointer list/retire list就可以。
讀取線程不應在acquire之後release之前掛掉,會導致內存無法釋放。
這讓我想起java gc,同樣不使用引用計數,對無鎖內存池表示很感興趣。多核編程帥呆了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章