我们是否需要在 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(或其他用作内存屏障的指令)。