首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当is_lock_free() ==为false时,是否存在不保证std::==原子性的情况?

当is_lock_free() ==为false时,是否存在不保证std::==原子性的情况?
EN

Stack Overflow用户
提问于 2022-11-29 04:21:36
回答 1查看 70关注 0票数 1

即使通常是is_lock_free() == false,也可以保证std::原子的原子性。是那么回事吗?

我徘徊于计算机环境或原子性不能保证的情况下,当is_lock_free() == false

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-29 04:36:46

非无锁原子不是无地址的,因此两个进程之间的共享内存意味着它们不尊重对方的锁。(对于在同一进程中包含相同原子对象的页面的两个虚拟映射,unless the hash table of locks仅在地址的低位(页内偏移量)上进行索引,但这可能是一个错误的设计。)

ISO C++没有定义内存映射函数或进程,因此标准本身并没有太多细节,只是说没有锁的原子应该是无地址的(这使得它们可以在共享内存中工作)。现实世界的实现就是这样。

否则它总是原子的。通常的实现机制很简单:使用地址索引一个表的自旋锁或互斥。

当然,这假设程序没有未定义的行为,但C++中的其他一切也是如此。在执行C++程序期间的任何地方,任何UB都意味着在该点之前或之后的所有保证都在窗口之外。

实际上,除了使用memcpy或普通uint64_t*来访问对象表示等非常明显的东西之外,没有很多方法可以打破非无锁的uint64_t*的原子性,而不是遍历std::atomic<uint64_t>类。

原子实际上更容易与UB中断,例如,通过取消与alignof(std::atomic<T>)不对齐的alignof(std::atomic<T>)来取消引用。在许多支持未对齐负载/存储的ISAs上,这将运行但实际上不是原子的,因为C++实现依赖于对齐负载和存储的原子性的硬件保证。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74609137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档