Критическая проблема раздела - PullRequest
1 голос
/ 16 июня 2010
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 Ответ

2 голосов
/ 16 июня 2010

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

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

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

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

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

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

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

edit2: FYI - http://msdn.microsoft.com/en-us/library/aa645755(v=VS.71).aspx

...