1

ここから

グローバル変数 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 が永遠に待機する理由がわかりました。違反している「ルール」に名前はありますか? たとえば、スレッドのコンテキストには、「相互排除」、「進行」、「制限付き待機」、および「スレッド/プロセスの相対速度に関する仮定なし」があるため、これらのいずれかが満たされていませんか?

4

1 に答える 1

1

問題の説明に 2 番目の仮定がありません。スレッドは非クリティカル セクションで終了する可能性があります。ここにコピーした説明では、「T1 は非クリティカル セクションで終了する」と指定されているため、T1 はこれ以上ターン = 0 を設定しません。

于 2013-10-07T21:03:18.490 に答える