簡體   English   中英

對原子變量的非原子操作

[英]Non atomic operation on atomic variables

假設我有這個代碼:

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;

不,你不能。

如果您有一個平台,其中對齊整數的讀取始終是原子的,那么您就沒有避免任何原子操作。 如果您有一個平台,其中對齊整數的讀取並不總是原子的,那么代碼顯然是不安全的。

當需要或不需要原子性時,能夠互換使用原子和非原子類型會很棒。 然而,C++ 模型中沒有任何東西允許它,而且很多事情都與它背道而馳。

但是內存模型首先是不健全的(例如:它沒有定義任何行為,它毫無意義)所以它應該從頭開始重建,然后你應該考慮你的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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