上篇文章:實現乙個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...