![](/img/trans.png)
[英]what can I do about GNU ld 'legacy __sync_synchronize' warning?
[英]What does __sync_synchronize do?
我猜它会强制使用内存栅栏。
这个内置函数会发出一个完整的内存屏障。
对于内存屏障,cpu对我们的指令进行排序,一般会提高效率,但可能会导致意想不到的结果。 例如,硬件中可能有四个寄存器:当您发出操作命令时,一个寄存器保存您的操作指令(如读取),两个寄存器保存参数(如地址、大小),最后一个寄存器为控制登记。 在所有参数准备好后,硬件将读取参数并执行程序,如下所示:
writereg (dev.register_size,size);
writereg (dev.register_addr,addr);
writereg (dev.register_cmd,READ);
writereg (dev.register_control,GO);
如果最后一个操作码放在其他之前,那么这不是我们所期望的,所以我们可以在前三个代码和最后一个代码之间放置一个内存屏障,强制CPU在前三个代码之后操作最后一个代码代码:
writereg (dev.register_size,size);
writereg (dev.register_addr,addr);
writereg (dev.register_cmd,READ);
__sync_synchronize();
writereg (dev.register_control,GO);
它停止排队写入和缓存读取。
“volatile”是使用代码立即获取或存储值的编译器选项,但现代 CPU 也有多个内核,带有 memory 缓存和延迟写入外部 memory。 __sync_synchronize() 确保所有内核同时看到相同的值。
...
X = new_value; // compiler and/or CPU could update X later when convienent
...
if ( X ) ... // compiler and/or CPU could use previous cached value of X
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.