技術介紹:
cas 原子操作:是有cpu提供的原子操作。
mydeque
入隊操作
void enqueue(t value)
//通過援助操作,更新tail
cas(&tail,tail,tail->next);
}
出對操作
t dequeue()
t temvalue=q->value;
recycle(q); //**空間
return temvalue;
}
以上是佇列出對入隊操作,
pseudocode from
article
of the above name in
podc96
(with two typos corrected), by
maged m. michael
and
michael l. scott
關於該演算法的一些優化
1.該演算法的入隊時候需要重新分配空間,分配空間這個開銷是很大的,實際上可以不用每次入隊都分配工具,可以是實現個多執行緒安全的freelist,用來存放可用的空間結點,每次入隊了,從freelist得到乙個空間,加入佇列。出隊時,可是把該空間加入到freelist,這樣可以節省空間分配和**的開銷,同時也可以避免aba問題。這個方法可以參考lmax disruptor.
2.關於偽共享的問題,需要cache line填充。在head,tail之間可以填充64位元組的無關資料。
訊息佇列 執行緒安全
為什麼在互斥量的基礎上還需要加條件變數?需要注意的是 include int pthread cond wait pthread cond t cv,pthread mutex t mutex 返回值 函式成功返回0 任何其他返回值都表示錯誤 函式將解鎖mutex引數指向的互斥鎖,並使當前執行緒阻塞...
java多執行緒 訊息佇列
1 定義乙個佇列快取池 private static list queuecache new linkedlist 2 定義佇列緩衝池最大訊息數,如果達到該值,那麼佇列檢入將等待檢出低於該值時繼續進行。private integer offermaxqueue 2000 3 定義檢出執行緒,如果佇列...
多執行緒14 模擬訊息佇列
1.模擬queue author alienware public class myqueue public void put object obj catch interruptedexception e list.add obj count.getandincrement count syste...