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