ここから
グローバル変数 turn は、クリティカル セクションに入る次のプロセスを示すために使用されます。ターンの初期値は 0 または 1 です。
int turn = 1;
T0:
while (true) {
while (turn != 0) { ; } (1)
critical section (2)
turn = 1; (3)
non-critical section (4)
}
T1:
while (true) {
while (turn != 1) { ; } (1)
critical section (2)
turn = 0; (3)
non-critical section (4)
}
何が問題なのかわかりません。while (turn != 1)
T0 が永遠に繰り返されるのはなぜですか? コンテキストが T1 に切り替わると、クリティカル セクションに入り、次に設定されturn=0
ます。
編集: T0 が永遠に待機する理由がわかりました。違反している「ルール」に名前はありますか? たとえば、スレッドのコンテキストには、「相互排除」、「進行」、「制限付き待機」、および「スレッド/プロセスの相対速度に関する仮定なし」があるため、これらのいずれかが満たされていませんか?