我们是否需要在 x86 上彼得森锁的 unlock() 函数中使用 mfence?
Do we need an mfence in the unlock() function of Peterson's lock on x86?
Peterson 的锁码取自 (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。
当然可以。它不需要任何特别不寻常的情况。
假设在CR中进行了一次计算,最后的动作是将结果存入内存。进一步假设在CR之后不久,另一个线程读取目标内存以获取计算结果。读取不能与写入重新排序,否则将获得错误的值。为避免这种情况,离开 CR 时需要 mfence
(或其他用作内存屏障的指令)。
Peterson 的锁码取自 (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。
当然可以。它不需要任何特别不寻常的情况。
假设在CR中进行了一次计算,最后的动作是将结果存入内存。进一步假设在CR之后不久,另一个线程读取目标内存以获取计算结果。读取不能与写入重新排序,否则将获得错误的值。为避免这种情况,离开 CR 时需要 mfence
(或其他用作内存屏障的指令)。