![]() |
1
11
在x86上,它将变成以锁为前缀的程序集指令,例如
内存屏障实际上是作为一个虚拟对象实现的。
在PPC上,它是不同的。安
LL/SC
对-
总而言之,原子计数器正常工作不需要显式内存屏障。 |
![]() |
2
4
区分原子访问(保证值的读/修改/写作为一个原子单元执行)和内存重新排序是很重要的。 内存屏障阻止读写的重新排序,并且重新排序与原子性完全正交。例如,在PowerPC上,如果您实现尽可能高效的原子增量,那么它将不会阻止重新排序。如果你想防止重新排序,那么你需要一个LWSYNC或同步指令,或者一些等价的高级(C++ 11?)记忆障碍。 声称“编译器不可能以有问题的方式对事物重新排序”作为一般性语句似乎很幼稚,因为编译器优化可能会非常令人惊讶,而且因为CPU(特别是PowerPC/ARM/Alpha/MIPS)会积极地重新排序内存操作。 一个一致的缓存也不能保存您。见 http://preshing.com/ 看看内存重新排序是如何工作的。 然而,在这种情况下,我认为答案是不需要障碍物。这是因为对于这个特定的情况(引用计数),不需要引用计数和对象中的其他值之间的关系。唯一的例外是当引用计数为零时。此时,确保其他线程的所有更新对当前线程可见是很重要的,因此读取获取屏障 可以 是必要的。 |
![]() |
3
2
你打算实施你自己的
作为一般规则,系统提供的原子增量/减量工具将应用所需的任何内存屏障,以便正确地执行操作。通常,您不必担心内存障碍,除非您正在做一些奇怪的事情,比如实现自己的无锁数据结构或STM库。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 8 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 8 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 8 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 8 月前 |