1
假設我有這樣的代碼:(?是否安全)非原子操作
std::atomic<int> a1;
std::atomic<int> a2;
std::atomic<int> a3;
std::atomic_store(&a1, 1);
std::atomic_store(&a2, 1);
std::atomic_store(&a3, 2);
int a2Value = std::atomic_load_explicit(&a2, std::memory_order_relaxed);
int a3Value = std::atomic_load_explicit(&a3, std::memory_order_relaxed);
std::atomic_compare_exchange_strong_explicit(
&a1,
&a2Value,
a3Value,
std::memory_order_relaxed,
std::memory_order_relaxed);
我可以替換成以下,以避免兩個原子上寫着:
a2Value = static_cast<int>(a2);
a3Value = static_cast<int>(a3);
std::atomic_compare_exchange_strong_explicit(
&a1,
&a2Value,
a3Value,
std::memory_order_relaxed,
std::memory_order_relaxed);
也可以我使用類似這樣的代碼來編寫一個原子變量而不用原子寫入?
*reinterpret_cast<int*>(&a2) = 5;
雖然這可能會起作用,但它在技術上將您帶入未定義的行爲土地,並且是可怕的做法。從多線程角度來看,這絕對是不安全的,並且進一步使用'std :: memory_order_relaxed'已經大大減少了原子訪問的開銷。 另請參閱:http://stackoverflow.com/questions/7234270/accessing-atomicint-of-c0x-as-non-atomic –
爲什麼你使用原子,如果你不想使用原子? (並且不,這是不安全的。) – Cameron
@SamCristall張貼的鏈接的副本。 http://stackoverflow.com/questions/7234270/accessing-atomicint-of-c0x-as-non-atomic – GManNickG