繁体   English   中英

通过联合非原子访问原子

[英]Non-atomic access to atomic through a union

我想原子地和非原子地操纵相同的存储位置。

假设我正在处理一个简单的类型,比如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)代替非原子操作的建议,我在这个相关问题的答案中尝试了这个建议,但它使我的代码减慢了50%。

无锁原子基元用于高度拥塞的并发。 如果存在高拥塞,并且您开始将原子变量用作非原子变量,则肯定会引入错误, 即使在特定的体系结构intatomic<int>具有相同的布局。

如果您的拥堵程度较低但在某些情况下需要特殊订购,则应使用锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM