彼得森的锁码来自(german) wikipedia:
# 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的情况下发生错误的例子吗?
N.B。:我确信enter_region
函数中需要一个mfence。
答案 0 :(得分:1)
不确定。它不需要任何特别不寻常的情况。
假设在CR中执行计算,最后的操作是将结果存储到内存中。进一步假设在CR之后不久,另一个线程读取目标存储器以获得计算结果。读取不得与写入重新排序,否则将获得错误的值。为避免这种情况,离开CR时需要mfence
(或其他用作记忆障碍的指令)。