在大多数情况下,我写了一些无锁代码,可以在本地读取时正常工作.
本地旋转读取内存是否必然意味着我必须在旋转读取之前始终插入内存屏障?
(为了验证这一点,我设法生成一个读写器组合,导致读者永远不会看到写入的值,在某些非常特定的条件下 - 专用CPU,连接到CPU的进程,优化器一直向上,没有其他工作在循环中完成 - 所以箭头指向那个方向,但我不完全确定旋转内存屏障的成本.)
如果在缓存的存储缓冲区中没有任何内容被刷新,那么旋转内存屏障的成本是多少?即,所有过程都在做(在C中)
while ( 1 ) {
__sync_synchronize();
v = value;
if ( v != 0 ) {
... something ...
}
}
Run Code Online (Sandbox Code Playgroud)
我是否正确地假设它是免费的并且它不会阻碍任何流量的内存总线?
另一种方法是问:内存屏障是否会执行任何操作:刷新存储缓冲区,对其应用失效,并阻止编译器在其位置重新排序读/写?
反汇编,__ sync_synchronize()似乎转化为:
lock orl
Run Code Online (Sandbox Code Playgroud)
从英特尔手册(同样模糊的新手):
Volume 3A: System Programming Guide, Part 1 -- 8.1.2
Bus Locking
Intel 64 and IA-32 processors provide a LOCK# signal that
is asserted automatically during certain critical memory
operations to lock the system bus or equivalent link.
While this output signal is asserted, requests …Run Code Online (Sandbox Code Playgroud)