單生產者和單消費者共同操作同一個消息隊列需要加鎖嗎


單生產者和單消費者的情況下可以不要鎖,但是memory barrier還是需要的。

考慮下面一個簡單的情況,初始時,data未初始化,flag = 0;

生產者線程:

data = 1;
flag = 1;

消費者線程:

while(!flag)
{};
read data;

這段代碼意思是消費者等到生產者把flag置為1后才去讀data的值,那么讀到的肯定是正確的結果對吧?但是現代的CPU做了各種優化,結果就是並不保證會按照編寫的順序去讀寫data和flag的值。

所以可能出現先寫flag,再寫data,或者先讀data,再讀flag。這種亂序可以保證在單線程情況下一定不會有問題,但是在多線程情況下,生產者中的flag = 1可能先於data = 1執行,執行完flag = 1后,data = 1之前,輪到消費者線程執行,此時判斷flag = 1,然后去讀data的值,會讀到未初始化的data,需要加memory barrier來保證正確性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM