通过联合对原子的非原子访问
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(...);
这会按预期工作吗?我可以以原子方式和非原子方式操作同一内存吗?
为了抢先使用CCD_ 7代替非原子操作的建议,对于一个相关的问题,我尝试了这个答案中的建议,但它使我的代码慢了50%。
无锁原子基元适用于高度拥塞的并发。如果存在高拥塞,并且您开始将原子变量用作非原子变量,那么您肯定会引入错误,甚至如果在特定架构上int
和atomic<int>
具有相同的布局。
如果您的拥塞程度较低,但在某些情况下需要特定的排序,则应该使用锁。
相关文章:
- C++:无法访问声明的受保护成员
- 如何正确实现和访问运算符的各种自定义枚举器
- 链表中写入访问冲突的未知原因
- 如何访问RTCVideoRenderer的帧?(ios)
- C++中原子的替代品<variant>
- 这是关于成员访问规则的正确摘要吗
- 使用内存地址访问结构的属性值
- 尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
- 调用原子的 store() 时可以调用基类型类的函数吗?C++
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 用于在并发环境中访问 MMIO 的软件模式
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 无法通过指针访问对象的成员
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 如何从传递到对象的对象内部访问对象的类属性?
- 如何在 lambda 中访问捕获的此指针的"typeid"?
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- “weak_ptr”和“shared_ptr”访问是原子的
- c++中访问原子变量的速度有多快?
- 通过联合对原子的非原子访问