繼Multiple assignment in one line後,我很想知道這對原子數據類型是如何工作的,特別是對於布爾類型的例子。在原子布爾變量的一個語句中多次賦值
考慮:
class foo {
std::atomic<bool> a;
std::atomic<bool> b;
public:
void reset();
[...] //Other methods that might change a and b
}
是否有任何區別:
void foo::reset() {
a = false;
b = false;
}
和:
void foo::reset() {
a = b = false;
}
也就是說,在第二種情況下,可以在發生b
分配後false
,另一個線程集b
到true
在讀取b
之前將其值分配給a
,以便在指令結束時a
的值爲true
?
(這也意味着後者的版本似乎是低效率)
硬盤沒有看到實際的編譯器輸出的說舊值,但'的std ::原子::運算符=()'應該返回傳遞給它的價值,所以我認爲'a = ...'根本不會讀取'b'的值,它只會從'operator ='的輸出中接收'false'。現在,在多線程情況下,當'reset()'退出時,'b'仍然可以是'true',但那是另一回事。 –
@RemyLebeau好吧,那麼我的問題幾乎可以回答,不應該有任何區別,否則編譯器會是次優的。謝謝! (當然,在'reset'結束時,如果另一個線程干預,'b'可能是'true') – Antonio