假設有一個由主線程控制的布爾標誌(keep_running)。另一個線程無限循環直到該標誌變爲假。應該布爾標誌總是原子?
int main() {
bool keep_running(true);
std::thread run([](bool &keep_running)
{
while(keep_running)
{
// do work
}
}, std::ref(keep_running));
// do other work
keep_running = false;
run.join();
return 0;
}
該標誌應該是原子嗎?
std::atomic<bool> keep_running
我想,這可能發生在非原子版本最差的將是標誌被正確的執行
while(keep_running)
當時間設定。在這種情況下,循環會繼續運行一次(不是嚴格需要的)迭代。但就我而言,這是可以接受的。
上面的代碼可能是錯誤的嗎?
編輯:
我在這個性能方面的原因大多是興趣(和沒有錯誤)。因此,對循環中的標誌使用std :: atomic是否會對性能產生負面影響?
在老版本的C++中,你會使用'volatile' - 沒有它,就有可能從另一個線程看不到從一個線程寫入變量。但是,因爲在C++ 11中有'atomic',你應該使用它來防止相同的問題。 –
當然它應該是原子的。這給你正確的語義。你爲什麼要做其他事情? –
我在想,我在旗幟周圍也不需要記憶障礙,也不需要關心指令重新排序。因此,我認爲我可以擺脫std :: atomic來獲得性能。我試圖澄清,通過編輯問題。但是我沒有意識到變量可能會卡在寄存器中,正如Tsyvarev在他的回答中所指出的那樣。 –