我想以原子方式和非原子方式操纵相同的内存位置。通过联合对原子进行非原子访问
让我们假设我有一个简单类型的工作,就像一个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%。
是什么让你认为'std :: atomic'在内部与'int'相同? –
如果它无锁且尺寸相同,我很难想象它会有所不同。 – foxcub
我也是,但我一直在这样的事情错了。我敢说,你会得到的最好结果是它看起来工作得很好 - 直到它没有。你永远不会失败,甚至不会注意到它。访问存储的值将以完全不同的方式完成。例如,通过“int”所做的更改可能对另一个CPU上运行的线程不可见。看看你的编译器发出的指令,看看它是否应该工作。充其量,我会说“工作”将是平台依赖的UB。但出于性能方面的原因,您可能需要这样做。 –