1

さて、私はgalvinの第6版からクリティカルセクションの問題を読んでいました. つまり、問題で使用されるアルゴリズムには、次のような while ループがあります。

do
  {
   while(turn!=i);
   critical section
   turn=j;
    remainder section
}while(1);

最初は turn==0 で、i=0 の場合、プロセス p0 は重大な問題を実行します。この 特定のケースでは、 はwhile(turn!=i);に評価されます。while(false)

ここで私の質問は、while ループが false と評価された場合、次のクリティカル セクションが評価される理由です。何らかの理由でwhile(turn!=i); にセミコロンがある場合、次のステートメントは while ループの影響を受けません! では、ここで while ループを使用するとは!? :|

4

2 に答える 2

2

この場合、while ループは無限にループするか、何もしません。セミコロン付きの while ループは、ループを試行する必要があることを指定しますが、while ブロックで実行される命令はありません。書くwhile (1);ことはと同等ですwhile (1) {}

この構文の一般的な使用法は、たとえば文字列の最後まで、さらに作業を繰り返すだけの場合です。あなたは次のようなものを書くでしょう

char *work_on_end_of_string(char *str) {
  int i = 0;

  while (str[i++]); 
  // now str[i] is pointing on the end of the string
}

あなたの場合、プログラムがマルチスレッドであるturni、クリティカルセクションを実行する前に異なる必要があると述べたように。while ステートメントを使用すると、スレッドが条件を満たすようにいずれかを変更するまで、この条件のテストをループできます。

于 2012-10-13T08:54:45.967 に答える
1

while ループの条件が false の場合、プロセス P0 のクリティカル セクションが実行され、条件が true の場合、while ループは (プロセス P0 がスリープ状態になると考えてください) ターンの値が他のプロセスによって変更されるまで繰り返されます。現在クリティカル セクションを実行しているプロセス。

于 2012-10-13T09:15:00.163 に答える