c++ - 通过 union 非原子访问原子

标签 c++ c++11 atomic

我想以原子方式和非原子方式操作同一内存位置。

假设我正在使用一个简单的类型,比如 int ,特别是 std::atomic<T>::is_lock_free()返回 true ,那sizeof(T) == sizeof(std::atomic<T>) .

我认为 reinterpret_cast应该工作:

std::atomic<int> x;
int& xx = reinterpret_cast<int&>(x);

但是N4013解释说这可能会混淆编译器中基于类型的别名分析,因此不可靠。

我的问题是:union 怎么样? ?如果我创建以下内容:

union AtomicInt
{
    int nonatomic;
    std::atomic<int> atomic;
};

AtomicInt x;
x.nonatomic = 5;
x.atomic.compare_exchange_weak(...);

这会按预期工作吗?我可以原子地和非原子地操作相同的内存吗?


抢占有关使用 load(std::memory_order_relaxed) 的建议代替非原子操作, 我试过 this answer 中的建议到相关问题,但它使我的代码速度降低了 50%。

最佳答案

无锁原子原语适用于高度拥挤的并发。如果拥塞严重,并且您开始将原子变量用作非原子变量,那么您肯定会引入错误,甚至如果在特定架构上 intatomic<int>具有相同的布局。

如果拥塞程度较低但在某些情况下需要特定顺序,则应使用锁。

关于c++ - 通过 union 非原子访问原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38528531/

相关文章:

c++ - windows 7和msvc下编译QT 5.3.2

c++ - std::pair 和 map::value_type 与 unique_ptr 的区别

c++ - 根据构成它的类型的存在有条件地定义一个成员变量

java - 如何以无锁方式原子更新2个对象?

android - 在 Android (ARM) 上比较和交换

c++ - Malloc 分配的内存多于 RAM

c++ - Visual C++ 和超长字符串

c++ - 具有可变模板模板参数的方法的部分特化

c++ - 与自定义分配器一起使用的最佳唯一指针是什么?

concurrency - SSE指令: which CPUs can do atomic 16B memory operations?