posix 标准说,诸如互斥锁之类的东西将强制执行内存同步。但是,编译器可能会重新排序内存访问。说我们有
lock(mutex);
setdata(0);
ready = 1;
unlock(mutex);
它可能会通过编译器重新排序更改为下面的代码,对吧?
ready = 1;
lock(mutex);
setdata(0);
unlock(mutex);
那么互斥锁如何同步内存访问呢?更准确地说,编译器如何知道不应该在锁定/解锁之间发生重新排序?
实际上在这里对于单线程方面,就绪分配重新排序是完全安全的,因为在函数调用锁(互斥锁)中不使用就绪。
已编辑:因此,如果函数调用是编译器无法通过的,我们可以将其视为编译器内存屏障,例如
asm volatile("" ::: "memory")