實現乙個lockfree的佇列 錯誤修改

2021-06-09 15:24:38 字數 1180 閱讀 8451

上篇文章:實現乙個lockfree的佇列

這個錯誤是同事發現的。他說曾經發現,有時某個執行緒能被掛起很長時間。

如果有這樣的情況,就可能會造成第一輪的a執行緒和第二輪的b執行緒訪問同乙個下標,這無疑是會出問題的。

於是我把下面放值和取值的時候也做了個限定,只有乙個執行緒能通過該鎖,這樣就安全了。

修改了標記的設定,不用預先設定的空值,而用另乙個char佇列實現標記,因為是char型別的,不但實現標記,還能實現標示狀態。

同時用基礎庫的原子操作函式代替了自己寫的,並做了些優化(這些優化是抄襲的),速度有所提高。10次讀寫在176秒左右。

static inline void prefetch(void *x) 

// 臨界鎖,執行緒安全

// ,

template class cqqueue_lockfree

; ~cqqueue_lockfree()

; var_4 initqueue(var_u8 lmaxqueuesize)

; void resetqueue()

; void clearqueue()

if(m_tp***queue)

m_lmaxqueuesize = -1;

m_lbegpos = 0;

m_lendpos = 0;

}; void pushdata(t_key tkey)

; t_key popdata()

;private:

var_u8 m_lmaxqueuesize __attribute__((aligned(64)));

t_key* m_tpqueue __attribute__((aligned(64)));

var_1* m_tp***queue __attribute__((aligned(64)));

var_u8 m_lbegpos __attribute__((aligned(64)));

var_u8 m_lendpos __attribute__((aligned(64)));

};

其實還有個更高速的優化,就是設定cpu的相關性,時間能減少三分之二,就是能達到60+秒。不過我覺得在實際應用中作用不大,就沒加上。

至此lockfree學習告一段落,相對於waitlock,時間減少了一半(waitlock 10億次是350秒)。

34 實現乙個佇列

思路一 這就是作業系統中介紹的pv操作,佇列的乙個典型的應用模式。實現這個pv操作的過程中要注意兩個執行緒之間的通訊就可以了。include stdafx.h include include include include include using namespace std handle g h...

實現乙個佇列類

include string include math.h include algorithm include iostream using namespace std template class node template class cirqueue 佇列類 template cirqueue...

兩個棧實現乙個佇列 兩個佇列實現乙個棧

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...