我看到一个关于计时的问题的回答使用了 __sync_synchronize() 函数。
- 这个函数是做什么用的?
- 何时需要使用它?
这是一个用于完整内存屏障的原子内置函数。
没有内存操作数会在该操作中被移动,无论向前还是向后。此外,将根据需要发出指令,以防止处理器在该操作中推测加载,并在操作后排队存储。
请查看上面链接中的详细信息。
此内置函数会发出完整的内存屏障指令。
关于内存屏障,CPU会对我们的指令进行排序,通常会提高效率,但也可能导致意外结果。例如,硬件中可能有四个寄存器:当您发出一个操作命令时,一个寄存器保存您的操作指令(例如读取),两个寄存器保存参数(例如地址、大小),最后一个寄存器是控制寄存器。当所有参数准备好之后,硬件将读取参数并执行程序,其过程可能如下所示:
writereg (dev.register_size,size);
writereg (dev.register_addr,addr);
writereg (dev.register_cmd,READ);
writereg (dev.register_control,GO);
writereg (dev.register_size,size);
writereg (dev.register_addr,addr);
writereg (dev.register_cmd,READ);
__sync_synchronize();
writereg (dev.register_control,GO);
...
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
...