[英]std::atomic bool or Normal global bool is good in single thread?
[英]Do I need std::atomic<bool> or is POD bool good enough?
考慮以下代碼:
// global
std::atomic<bool> run = true;
// thread 1
while (run) { /* do stuff */ }
// thread 2
/* do stuff until it's time to shut down */
run = false;
我是否需要與原子變量相關的開銷? 我的直覺是,布爾變量的讀/寫無論如何都或多或少是原子的(這是常見的g ++ / Linux / Intel設置)並且如果有一些寫/讀時序怪異,並且我在線程1上的運行循環停止一個結果提前或結束,我對這個應用程序並不十分擔心。
或者我在這里缺少一些其他考慮因素? 看看perf,看來我的代碼花了相當多的時間在std::atomic_bool::operator bool
,我寧願把它放在循環中。
您需要使用std::atomic
來避免不希望的優化(編譯器一次讀取值並始終循環或從不循環)並在沒有強排序內存模型的系統上獲得正確的行為(x86是強有序的,因此一旦寫完成,下一次讀取會看到它;在其他系統上,如果線程由於其他原因沒有將CPU緩存刷新到主RAM,那么很長時間內可能看不到寫入,如果有的話)。
您可以改善性能。 std::atomic
默認使用使用了對單個標志值過度殺傷的順序一致性模型 。 您可以通過使用加速它load
/ store
有一個明確的(以及不太嚴格的)的存儲排序,所以每個load
使用的最偏執的模式,以保持一致性是不需要的。
例如,您可以這樣做:
// global
std::atomic<bool> run = true;
// thread 1
while (run.load(std::memory_order_acquire)) { /* do stuff */ }
// thread 2
/* do stuff until it's time to shut down */
run.store(false, std::memory_order_release);
在x86機器上,任何比(默認的,最嚴格的)順序一致性排序更嚴格的排序通常最終什么都不做,只是確保指令按特定順序執行; 由於強有序的存儲器模型,不需要總線鎖定等。 因此,除了保證值實際上是從內存中讀取,而不是緩存到寄存器並重用,在x86上使用原子這種方式是免費的,而在非x86機器上,它使你的代碼正確(否則它不會是)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.