考慮我們有三個線程,bool status_flag[500]
陣列和工作情況如下:在這種情況下,我真的需要互斥鎖嗎?
兩個線程只有在
status_flag
陣列在不同的索引寫作。而第三個線程只能讀取任何索引。所有三個線程寫在不同的索引。儘管所有三個線程都在任何索引處讀取。
在書寫操作中,我們只是設置標誌,不會重新設置它。
status_flag [i] = true;
在讀取操作中,我們正在做這樣的事情:
for(;;){ //spinning to get flag true
if(status_flag [i] == true){
//do_something ;
break;
}
}
什麼發生,如果編譯器優化(分支預測)代碼?
我已經讀了很多關於鎖定的知識,但仍然有混淆的結論。請幫我總結一下。
您需要同步。無論你需要*互斥*是一個不同的問題。 – EOF
是的,互斥/信號量,操作必須是「原子的」,因爲你從另一個線程寫入的地方讀取。 –
@mohan分支預測是一種處理器流水線優化。如果你認爲'status_flag'會被優化,你可以使用'volatile'關鍵字。 –