1. 程式人生 > 其它 >無鎖佇列

無鎖佇列

單生產者

  初始位置:生產者的頭和尾指向相同的位置;並只有生產者的頭和尾被修改

  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上更新