2014-03-05 139 views
2

有一個目標是使線程池將優先支持任務。 所以我需要寫一些數據結構來支持線程安全的優先級隊列。 當然,我們可以寫大鎖並使用std :: priority_queue。但這不是很有效。線程安全優先級隊列

有一個想法實現具有併發提取的二進制堆(每個元素都有自己的自旋鎖,並且存在一個全局shared_mutex,當我們修改堆大小並在讀取鎖定節點時,它是寫鎖定的,當我們交換和比較節點,我們鎖定它們的自旋鎖),但是有很多潛在的死鎖能力,我仍然不知道如何避免它們。

有什麼好的數據結構可以更容易地做成線程安全的嗎?還是有任何已經實施的堆,我可以調查?

回答

2

不要這麼快就會認爲無鎖優先級隊列會比互斥鎖更快。正如你所看到的,任何顯着複雜的無鎖結構往往是極其複雜的,涉及大量的原子操作。而在現代處理器上,由於在多核CPU中保持內存視圖一致的複雜性,這些原子操作變得相對慢得多。

在這種情況下,我想如果圍繞一個簡單的二元堆一個簡單的自旋鎖並沒有多少,比無鎖堆實現更快,無論競爭水平來目瞪口呆。

+0

我不想讓它無鎖,而是讓它更簡單。也許有一些很好的方法可以阻止它,但細化 – DuXeN0N

+0

@ DuXeN0N連續的流行第一操作將爭奪實際上相同的一組插槽,無論鎖的細密程度如何,它們都可以有效地將它們序列化。選擇是在抓住一把鎖和抓住幾把鎖之間。 – Sneftel

4

你真的應該實現你可以找到的最簡單的東西,用鎖保護它,並在你的應用程序中測試它。除非您每秒鐘觸碰數千次,否則鎖的開銷幾乎肯定與您的應用程序的性能無關。如果你的隊列相對較小,情況尤其如此。

我的建議是用std::priority_queue開始,環繞它的鎖,並給它一個鏡頭。

如果你真的覺得你需要一個無鎖併發優先級隊列,看Concurrent mutable priority queue