![]() |
1
4
是的,无锁原子在所有普通CPU上的所有C++实现中都是无地址的,并且可以安全地用于进程之间的共享内存。 非锁自由原子 1个 不会 不过,在两个进程之间要安全。每个进程都有自己的锁哈希表( Where is the lock for a std::atomic? ) C++标准打算在进程间共享内存中使用无锁原子,但它只能在不定义术语的情况下尽可能地使用“应该”。
这是一个在当前硬件上很容易实现的实现质量的推荐,事实上,你必须努力设计一个DexSturt9900c++实现,它在X86/ARM/PowerPC /其他主流CPU上被破坏,而实际上是被锁定的。
硬件为原子读修改写操作公开的机制是基于只关心物理地址的mesi缓存一致性。x86
大多数非x86体系结构使用 LL/SC ,它允许您编写一个重试循环,仅当它是原子的时才执行存储。LL/SC可以以无等待的方式模拟开销为O(1)的CAS,而不引入地址。
C++无锁原子汇编直接使用L/SC指令。看我的答案
原子纯加载或纯存储更容易,并且可以免费使用对齐的数据在x86上,请参见 Why is integer assignment on a naturally aligned variable atomic on x86? 其他isa也有类似的规则。 相关报道:我的回答中包括了一些关于免费地址的评论 Genuinely test std::atomic is lock-free or not 是的。我不确定它们是有用的还是正确的:。/ 脚注1 以下内容:
所有主流CPU都有无锁原子,对象宽度不超过指针。有些有更宽的原子,像x86有
(有些微控制器不能在一个寄存器中保存指针(或通过一个操作复制指针),但通常没有这种isa的多核实现。)
我不知道有任何合理的理由在硬件上工作,任何像正常的现代CPU。你可以想象一些体系结构,通过将地址提交给 我认为C++标准希望避免尽可能多地限制非主流实现。例如C++在某种解释器之上,而不是编译为“正常”CPU架构的DO机器代码。 IDK,如果您可以有效地在一个松散耦合的共享内存系统上实现C++,比如一个带有以太网链接的集群,而不是共享内存,或者非相干共享内存(必须显式地刷新其他线程来查看您的存储)。 我认为主要是C++委员会对原子论怎么说不多。 必须 在不假设实现将在操作系统下运行程序的情况下实现,其中多个进程可以设置共享内存。 他们可能在想象未来的Isa,其中无地址原子是不可能的,但我认为他们更可能不想谈论多个C++程序之间的共享内存。标准只要求实现运行一个程序。
显然
|