对原子变量的非原子操作

时间:2013-10-25 17:52:02

标签: c++ multithreading c++11 atomic

假设我有这段代码:

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;

2 个答案:

答案 0 :(得分:1)

不,你不能。

如果你有一个平台,其中对齐整数的读取总是原子的,那么你没有避免任何原子操作。如果你有一个平台,其中对齐整数的读取并不总是原子的,那么代码显然是不安全的。

答案 1 :(得分:1)

当需要或不需要原子性时,能够互换使用原子类型和非原子类型将是很棒的。但是,C ++模型中没有任何东西允许这样做,并且有很多事情与之相反。

但是首先内存模型并不完善(例如:它没有定义任何行为,这是毫无意义的),因此应该从头开始重建它,然后考虑您的建议。