c++ - 对原子变量的非原子操作

标签 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;

最佳答案

不,你不能。

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

关于c++ - 对原子变量的非原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596431/

相关文章:

ios - NSRunLoop : Is it really idle between kCFRunLoopBeforeWaiting & kCFRunLoopAfterWaiting?

c++ - C++11 中的 Numerical Recipes v3.0 和 pthread 库

c++ - 为什么在析构函数中抛出异常时不调用重载删除?

带有 -Wshadow 警告的 C++ 结构化绑定(bind)?

asp.net-mvc - ASP.NET Mvc +线程

c++ - 使用非静态数据成员和嵌套类构造函数的类内初始化时出错

java - spring异步传递对象线程对以前的更新是安全的

c++ - 从两个不同的数据结构将数据插入 std::map <std::string, int> mymap 并通过套接字发送

c++ - Opencv Mat转换为QByteArray

c++ - 获取别名 std::array 的大小?