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