單生產者和單消費者的情況下可以不要鎖,但是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來保證正確性。
