通过联合

时间:2016-07-22 14:07:11

标签: c++ c++11 atomic

我想原子地和非原子地操纵相同的记忆位置。

我们假设我使用的是简单类型,例如int,特别是std::atomic<T>::is_lock_free()返回truesizeof(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%。

1 个答案:

答案 0 :(得分:-1)

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

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