我想以原子方式和非原子方式操作同一内存位置。
假设我正在使用一个简单的类型,比如 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%。
最佳答案
无锁原子原语适用于高度拥挤的并发。如果拥塞严重,并且您开始将原子变量用作非原子变量,那么您肯定会引入错误,甚至如果在特定架构上 int
和 atomic<int>
具有相同的布局。
如果拥塞程度较低但在某些情况下需要特定顺序,则应使用锁。
关于c++ - 通过 union 非原子访问原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38528531/