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

时间:2015-02-03 18:24:22

标签: c++ c locking

彼得森的锁码来自(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。

1 个答案:

答案 0 :(得分:1)

不确定。它不需要任何特别不寻常的情况。

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