假设我有这段代码:
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;
答案 0 :(得分:1)
不,你不能。
如果你有一个平台,其中对齐整数的读取总是原子的,那么你没有避免任何原子操作。如果你有一个平台,其中对齐整数的读取并不总是原子的,那么代码显然是不安全的。
答案 1 :(得分:1)
当需要或不需要原子性时,能够互换使用原子类型和非原子类型将是很棒的。但是,C ++模型中没有任何东西允许这样做,并且有很多事情与之相反。
但是首先内存模型并不完善(例如:它没有定义任何行为,这是毫无意义的),因此应该从头开始重建它,然后考虑您的建议。