0

私は書くように頼まれました:次の場合のenter functionとexit function:

N 個のプロセスと M 種類のプロセス (N>>M) があり、同じ種類のすべてのプロセスが入ることができるクリティカル セクションがあります。たとえば、タイプ A が cs にある場合、タイプ B は cs に入ることはできません。ただし、タイプ A のプロセスはすべて入ることができます。

ミューテックスと、プロセスのタイプである「タイプ」のみを使用できます。デッドロックは許されません。

これでいいと思いますか?

shared: this.type = -1;
mutex m, m1=1;

enter{
    down(m)
    if (this.type == process.type) up(m1)
    down(m1)
    this.type= process.type
    up(m)
}
exit {
    this.type = -1
    up(m1)
}

ありがとう!(ちなみに、これは HW ではありません。私は試験を受けており、過去のテストを解いています)

4

2 に答える 2

0

いいえ、現在の方法は大丈夫ではありません。

具体的には、タイプ 0 が入ってきて、Enter を通過するとします。タイプ 1 は、タイプ 0 が終了する前に通過します。ミューテックスにヒットし、プロセスの種類が間違っていることを発見し、m1 をロックします。その後、タイプ 0 が通過し、m のロックを解除し、プロセス タイプをリセットしますが、m1 のロックは引き続き有効です。

さらに、タイプ 0 のプロセスが 2 つある場合、最初に終了するプロセスによって、プロセスがまだクリティカル セクションにある間に、実行中のプロセス タイプがリセットされます。

「上」はロック解除に似ており、「下」はロックに似ていると仮定しています。ただし、セマフォを対象とした一連のメソッドのように聞こえます。また、システムには 2 つのミューテックス (m と m1) しかないと仮定しています。マークアップはそれについて完全に明確ではないためです。

編集:あなたが提供した提案は、次のようなものになります:

shared: this.type = -1;
mutex m, m1=1;
count=0;

enter{
    down(m)
    if (this.type == process.type) up(m1)
    down(m1)
    this.type= process.type
    count++;
    up(m)
}
exit {
    count--;
    if(count==0) this.type = -1
    up(m1)
}

これには、状態の変更時に exit がスレッドセーフではないという問題がまだあります。また、新しいプロセスが起動/実行を開始しても、その兄弟は起動されません。

条件変数なしでこれを行う安全な方法があるかどうかは完全にはわかりません。問題に関する詳細情報がない限り。(つまり、これは、メソッドの実行が既にスレッドセーフである「モニター」のコンテキストにあります)

于 2009-08-03T16:26:16.173 に答える
0

私はあなたの言うことを考えて、実際に問題を見ることができます-10X!

カウンターを追加するとどうなりますか?同じタイプの最初のプロセスが入ったとき if counter==0 type==process.type (タイプを初期化する)

終了時: counter-- (count==1) type=-1 の場合、私はチェックします。

より良い??

于 2009-08-03T16:53:44.820 に答える