[英]Undefined behaviour when using a non-atomic bool
當使用普通的bool標志控制一個線程何時停止其工作時,最糟糕的事情是什么? 唯一的特點是線程停止的確切時間根本不是很重要,它只是播放某些媒體,甚至可能在我關心的所有內容上遲到半秒。 它有一個簡單的while(!restart)循環:
while (!restart) //bool restart
{
//do something
}
而另一個線程改變了一些現象,然后將restart設置為true:
someSetting = newSetting;
restart = 1;
由於回放循環每秒運行數千次,因此我擔心使用原子布爾可能會增加延遲。 我了解這是“未定義的行為”,但是這如何表現出來呢? 如果某個時刻的布爾值為54r * wx]%,那又如何? 我可以得到運行時錯誤嗎? 布爾值實際上會變為一個可理解的值,不是嗎? (該代碼當前有效,順便說一句。)在另一篇文章中,有人建議該標志可能根本不會更改,因為線程具有單獨的緩存-這對我來說似乎很奇怪,即使編譯器必須確保更改共享變量,即使是否存在數據競賽? 還是重啟后控制線程的執行順序可能更改並且someSetting可能更改? 同樣,這聽起來令人毛骨悚然,為什么編譯器會允許這種情況發生?
我已經考慮過在循環內設置一個計數器,並且僅每千次檢查一次原子布爾標志。 但是除非我真的必須,否則我不想這樣做。
UB並不意味着您的代碼不起作用,僅意味着您的代碼行為未由標准指定。 您必須使用std::atomic
使您的代碼符合標准,而無需實際更改其行為。 您可以使用memory_order_relaxed
做到這memory_order_relaxed
:
atomic<int> restart ....
while (!restart.load(memory_order_relaxed))
{
//do something
}
在另一個線程中:
someSetting = newSetting;
restart.store(1, memory_order_relaxed);
該代碼將發出與您相同的指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.