簡體   English   中英

使用非原子布爾時的不確定行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM