我想原子地和非原子地操纵相同的记忆位置。
我们假设我使用的是简单类型,例如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%。
答案 0 :(得分:-1)
无锁原子基元用于高度拥塞的并发。如果存在高拥塞,并且您开始将原子变量用作非原子变量,那么如果在特定体系结构int
上atomic<int>
和{{},那么肯定会引入错误,甚至 {1}}具有相同的布局。
如果您的拥堵程度较低但在某些情况下需要特殊订购,则应使用锁。