Критическая проблема раздела

proces P0:                             proces P1:
while (true)                           while (true)
{                                      {
  flag[0] = true;                          flag[1] = true;
  while (flag[1])                          while (flag[0])
  {                                        {
     flag[0] = false;                        flag[1] = false;
     flag[0] = true;                         flag[1] = true;
  }                                        }
 crit0();                                  crit1();
 flag[0] = false;                          flag[1] = false;
 rem0();                                   rem1();
}                                       }

Мог кто-то давать мне сценарий с контекстными переключениями, чтобы доказать, отвечает ли вышеупомянутый установленный код требованиям прогресса и ограниченного ожидания.

И может любой давать мне некоторые подсказки о том, как обнаружить, если код отвечает требованиям прогресса или ограниченного ожидания (и возможно включая исчерпание ресурсов, мертвую блокировку и после - Вы после Вас)

1
задан Amardeep AC9MF 16 June 2010 в 17:20
поделиться

1 ответ

Два процесса происходят в одно и то же время.

Фокус здесь в том, что, поскольку нет ничего, действительно синхронизирующего эти две программы, что-то может произойти между строками. На этой же ноте возможно, что вещи происходят в одно и то же время.

Чтобы понять, как это может стать проблемой, подумайте о такой ситуации...

Что произойдет, если первый флаг[0] = true и первый флаг[1] = true произойдут на P0/P1 в одно и то же время?

И процесс 1, и процесс 2 застрянут в цикле while. Как бы они вышли из цикла while? Один процесс должен был бы проверить while(flag[other]) точно в тот же момент, когда другой процесс установил свой flag[me] в true. Это очень узкий промежуток времени. Это эквивалентно бросанию игральных костей снова и снова и не продолжать, пока не выпадет определенное число.

Вот почему нам нужно что-то более высокого уровня для синхронизации - настоящие блокировки и тому подобное.

правка: О, еще одна вещь. Вы можете проверить, являются ли операции чтения/записи потокобезопасными. Что произойдет, если система попытается записать бит в то же время, когда она пытается его прочитать?

edit2: К вашему сведению - http://msdn.microsoft.com/en-us/library/aa645755(v=VS.71).aspx

2
ответ дан 2 September 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: