通过联合对原子的非原子访问

Non-atomic access to atomic through a union

本文关键字:访问 原子的      更新时间:2023-10-16

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

假设我使用的是一个简单的类型,比如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(...);

这会按预期工作吗?我可以以原子方式和非原子方式操作同一内存吗?


为了抢先使用CCD_ 7代替非原子操作的建议,对于一个相关的问题,我尝试了这个答案中的建议,但它使我的代码慢了50%。

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

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