假设我有这段代码:
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++ - 对原子变量的非原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596431/