我们需要在Peterson锁定x86的unlock()函数中使用mfence吗?

彼得森的锁码取自(德国)维基百科 :

# define FALSE 0 # define TRUE 1 # define N 2 int turn; int interested[N]; void enter_region(int process) { int other; other = 1 - process; interested[process] = TRUE; turn = other; while (interested[other] == TRUE && turn == other) ; } void leave_region(int process) { interested[process] = FALSE; } 

有人可以想到一个例子,在leave_region函数中没有mfence的情况下发生错误吗?

注意:我确信在enter_region函数中需要一个mfence。

当然。 它不需要任何特别不寻常的情况。

假设在CR中执行计算,最后的操作是将结果存储到存储器中。 进一步假设在CR之后不久,另一个线程读取目标存储器以获得计算结果。 读取不得与写入重新排序,否则将获得错误的值。 为避免这种情况,离开CR时需要mfence (或其他用作内存屏障的指令)。