Это домашнее задание.Чтобы найти правильный ответ для этого (и для большинства вещей, связанных с условиями гонки в целом):
Разбейте код, который каждый поток делает на «атомные части».Например, что-то вроде 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
Примечание: сначала это звучит как большая работа;но это не займет много времени, прежде чем вы сможете быстро пропустить случаи «вряд ли будет проблемой» и сосредоточиться на случаях «с большей вероятностью проблемы».