Нужен ли нам mfence в функции unlock () блокировки Петерсона на x86?

0

Код блокировки Петерсона, взятый из (немецкий) 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?

N.B.: Я точно знаю, что требуется функция mfence в функции enter_region.

  • 0
    Что такое ЧР ?
  • 0
    @WeatherVane "критический регион". Мы говорим о примитивах синхронизации.
Показать ещё 3 комментария
Теги:
locking

1 ответ

1
Лучший ответ

Конечно. Это не требует особо необычной ситуации.

Предположим, что вычисление выполняется в CR, причем конечным действием является сохранение результата в памяти. Предположим далее, что вскоре после CR другой поток считывает целевую память с целью получения результата вычисления. Чтение не должно быть переупорядочено с помощью записи else, и будет получено неправильное значение. Чтобы избежать этого, при выходе из CR требуется mfence (или другая инструкция, служащая барьером памяти).

  • 0
    Я думаю, что понял. Таким образом, даже если в исходном коде второй поток запускается после того, как первый поток покинул CR (в исходном коде), существует вероятность, что чтение второго потока произойдет до записи первого потока - правильно?
  • 0
    В любой реализации потока, которую стоит использовать, представление памяти нового потока изначально согласуется с его родительским потоком. Таким образом, если поток запускается в CR, запускает новый поток, то новый поток должен видеть все записи, выполненные в CR его родителем. Это не применяется автоматически, однако, если это другой поток, который запускает новый. На практике это зависит от реализации, какой эффект может иметь запуск нового потока в отношении пар потоков, отличных от пары (родитель, потомок).
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню