簡體   English   中英

我需要std :: atomic嗎? <bool> 還是POD bool足夠好?

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

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