Предположим, что мы используем одну переменную блокировки для решения проблемы взаимного исключения, как в приведенном ниже коде? - PullRequest
0 голосов
/ 17 октября 2018
boolean lock = false;
  // in thread 1
     while (true) {
     if (lock) {
          lock = true;
          criticalRegion1();
          lock = false;
            }    
        }
        // in thread 2
            while (true) {
                if (!lock) {
                    lock = true;
                    criticalRegion(2);
                    lock = false;
        }
    }

Это работает правильно?Если да, объясните как.Если нет, опишите, как может выполняться программа, приводящая к состоянию гонки?

1 Ответ

0 голосов
/ 17 октября 2018

Это домашнее задание.Чтобы найти правильный ответ для этого (и для большинства вещей, связанных с условиями гонки в целом):

Разбейте код, который каждый поток делает на «атомные части».Например, что-то вроде x++; следует рассматривать как три шага (temp = x; temp++; x = temp;, где temp - это регистр, а не переменная).Забудьте о вещах, которые не имеют глобально видимого состояния (например, доступ к локальной переменной не важен, потому что другой поток не заботится, но доступ к глобальной переменной важен, потому что другой поток увидит или повлияет на нее).

Далее;вообразите каждый возможный порядок, в котором эти «важные атомные части» могут быть выполнены;и посмотрите, есть ли проблема.

Например, если один поток имеет 2 атомных элемента A и B;и если другой поток имеет 2 атомных элемента C и D;тогда вы захотите рассмотреть:

A, B, C then D
A, C, B then D
C, A, B then D
A, C, D then B
C, A, D then B
C, D, A then B

Примечание: сначала это звучит как большая работа;но это не займет много времени, прежде чем вы сможете быстро пропустить случаи «вряд ли будет проблемой» и сосредоточиться на случаях «с большей вероятностью проблемы».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...