多執行緒安全無鎖訊息佇列

2021-06-18 21:23:55 字數 866 閱讀 9498

技術介紹:

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...