2013-10-25 129 views
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; 
+1

雖然這可能會起作用,但它在技術上將您帶入未定義的行爲土地,並且是可怕的做法。從多線程角度來看,這絕對是不安全的,並且進一步使用'std :: memory_order_relaxed'已經大大減少了原子訪問的開銷。 另請參閱:http://stackoverflow.com/questions/7234270/accessing-atomicint-of-c0x-as-non-atomic –

+1

爲什麼你使用原子,如果你不想使用原子? (並且不,這是不安全的。) – Cameron

+0

@SamCristall張貼的鏈接的副本。 http://stackoverflow.com/questions/7234270/accessing-atomicint-of-c0x-as-non-atomic – GManNickG

回答

1

不,你不能。

如果您有一個讀取對齊整數總是原子的平臺,那麼您還沒有避免任何原子操作。如果你有一個讀取對齊整數並不總是原子的平臺,那麼代碼顯然是不安全的。