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();
} }
Мог кто-то давать мне сценарий с контекстными переключениями, чтобы доказать, отвечает ли вышеупомянутый установленный код требованиям прогресса и ограниченного ожидания.
И может любой давать мне некоторые подсказки о том, как обнаружить, если код отвечает требованиям прогресса или ограниченного ожидания (и возможно включая исчерпание ресурсов, мертвую блокировку и после - Вы после Вас)
Два процесса происходят в одно и то же время.
Фокус здесь в том, что, поскольку нет ничего, действительно синхронизирующего эти две программы, что-то может произойти между строками. На этой же ноте возможно, что вещи происходят в одно и то же время.
Чтобы понять, как это может стать проблемой, подумайте о такой ситуации...
Что произойдет, если первый флаг[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