無鎖佇列
阿新 • • 發佈:2021-07-11
單生產者
初始位置:生產者的頭和尾指向相同的位置;並只有生產者的頭和尾被修改
1.生產者的頭和消費者的尾指向臨時變數,prond_next指向表的下一位置,如果沒有足夠的空間,返回錯誤
2.prod_head(原變數而非臨時變數)指向prod_next,新元素入隊
3.修改prod_tail指向prod_head(都是原變數),入隊完畢
單消費者出隊
1.消費者的頭和尾索引賦值給臨時變數,並將next指向表的下一位置
2.cons_head指向cons_next位置,並使隊頭元素出隊
3.cons_tail指向cons_head位置,出隊完畢
多生產者入隊
1.在兩個core上,將生產者的頭索引和消費者的尾索引交給臨時變數,prod_next指向表的下一位置,若沒有足夠空間則返回一個錯誤
2.prod_head(原變數)指向prod_next(兩個core上的變數)位置,用cas操作
3.cas在core2上執行成功
4.更新prod_tail,當prod_tail==prod_head臨時變數時,更新prod_tail,先在core1上進行
5.core1上更新完成後,到core2上更新