2

假设我有这个代码:

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;
4

2 回答 2

1

不,你不能。

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

于 2016-06-04T15:24:46.230 回答
1

当需要或不需要原子性时,能够互换使用原子和非原子类型会很棒。然而,C++ 模型中没有任何东西允许它,而且很多事情都与它背道而驰。

但是内存模型首先是不健全的(例如:它没有定义任何东西的行为,它毫无意义)所以它应该从头开始重建,然后应该考虑你的建议。

于 2019-12-01T16:58:11.130 回答