2014-04-09 16 views
-1

我正在尋找一個簡單的無鎖作業隊列,可以通用的方式跨平臺使用。無鎖作業隊列(多個讀/寫) - 請求複查

*沒有外部依賴關係,只有很少的調用接口,沒有特殊的編譯器技巧,可能會從編譯器到編譯器,最好只是頭文件。

要麼我吮吸谷歌搜索,或者這是不可用。 (它們不是相互排斥的,但你得到點)

+2

這個問題似乎是題外話題,因爲它是關於代碼審查。它應該問http://codereview.stackexchange.com/ – pmr

+0

正如@Edward也建議,這是現在可用codereview http://codereview.stackexchange.com/questions/46722/lock-free-job-隊列無大小限制多讀寫 – Arjan

+0

此外,題外話題:標題和問題不匹配。標題要求代碼審查(無題,屬於codereview.stackexchange.com),該問題要求實現(脫離主題,要求圖書館等)。 – stefan

回答

2

在推送功能,讓馬克兩點:

Line 1: start_.compare_exchange_strong(tmp, newnode); 
Line 2: node_ptr prev_end = end_.exchange(newnode); // and set next pointer 

現在,考慮兩個線程調用推送:

   start end  a.next b.next 
Begin   null null -  - 
TA.push(a) - 1 a  null null null 
TB.push(b) - 1 a  null null null 
TB.push(b) - 2 a  b  null null 
TA.push(a) - 2 a  a  null a 

正如你可以看到,b在列表中丟失。

+0

它看起來像這是一個空列表是唯一的,我猜接下來的2行應該分配end_開始_-> next如果它是空的,每當prev_end是一個nullptr – Arjan