我想以原子和非原子的方式操作相同的内存位置。
假设我使用的是一个简单的类型,比如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%。
无锁原子基元适用于高度拥塞的并发。如果存在高拥塞,并且您开始将原子变量用作非原子变量,那么您肯定会引入错误,甚至如果在特定架构上int
和atomic<int>
具有相同的布局。
如果您的拥塞程度较低,但在某些情况下需要特定的排序,则应该使用锁。