0

私は試験のために勉強していますが、コンセプトに問題があります。これは私が与えられた疑似コードです:

int mutex = 0;
do {
  while (TestAndSet(&mutex));
  // critical section
  mutiex = 0;
  // remainder section
} while (TRUE);

このコードでは、必要な 3 つの条件 (相互排除、進行、制限付き待機) のうち 2 つだけが満たされているとインストラクターは言っていますが、どれが満たされていないのかわかりません...??

クリティカル領域の問題を解決するために欠落状態をサポートするには、コードをどのように変更する必要がありますか? 洞察を事前にありがとう!

4

4 に答える 4

3

誰かが答えを探しているのを見た場合、上記のコードは制限付きの待機をサポートしていません (プロセスが待機する時間には制限が必要です)。これは、SetAndTest を使用して確実に同期するために、3 つの条件すべてが満たされていることを確認するための正しいコードです。

do{
  waiting[i] = TRUE;
  key = TRUE;
  while(waiting[i] && key)
    key = TestAndSet(&lock);
  waiting[i] = FALSE;

  // Critical Section

  j = (i + 1) % n;
  while ((j != i) && !waiting[j])
    j = (j+1) % n;

  if (j == i )
    lock = FALSE;
  else
    waiting[j] = FALSE;

  // Remainder Section
} while (TRUE);
于 2010-04-07T16:53:01.040 に答える
1

まず第一に、素敵な小さな例ですが、testandset はブール値の引数を取り、デフォルトでミューテックスは に設定されていFALSEます。int mutex=0実際にはそうですboolean mutex=FALSE。上記のコードには、相互排除と進行がありますが、制限された待機はありません。の定義もtestandset間違っています。であってはなりtarget=TRUEませんtarget=TRUE

于 2012-09-12T16:18:30.583 に答える
0

ここでは制限付き待機は満たされていません。他のプロセスの枯渇を避けるために、特定のプロセスが Critical Section に入ることができる回数に制限が必要であることがわかります...そして、プロセスが待機する時間に制限が必要です

于 2013-01-12T08:59:19.390 に答える
0

アトミック LOAD および STORE 命令を使用してミューテックスを設定し、メモリ アクセスの順序が変更されないようにする必要があるためでしょうか。一連の命令のアトミック実行とは、命令が中断できない単一のステップとして扱われることを意味します。

// example process using mutual exclusion
void process() {
  int mutex;
  init_lock (&mutex);
  do {
    lock (&mutex);
    // critical section
    unlock (&mutex);
    //remainder section
  } while(TRUE);
}

// mutual exclusion functions
void init_lock (int *mutex) {
  *mutex = 0;
}

void lock (int *mutex) {
  while(TestAndSet(mutex))
}

void unlock (int *mutex) {
  *mutex = 0;
}

int TestAndSet(*target) {
  int rv = *target;
  *target = 1;
  return rv;
}

見てみると先ほど投稿したサンプルコードと同じように関数が動いているように見えますが、*target上で動作する関数はアトミックなので、こうすれば相互排除が保証されるのではないでしょうか…??

誤字脱字すいません…

于 2010-04-07T00:47:12.580 に答える