2009-08-03 12 views
0

次のような場合に関数と終了関数を入力してください。NプロセスとMタイプのプロセス - 入力と終了cs

NプロセスとMタイプのプロセスがあります(N >> M) 同じタイプのすべてのプロセスが入ることができる重要なセクションがあります。 たとえば、タイプAがcsの場合、タイプBはcsを入力できません。タイプAのすべてのプロセスに入ることができます。

私は、プロセスのタイプであるmutexと "type"のみを使用できます。 デッドロックは許可されていません。

これは問題ありませんか?

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ではありません。私は試験を受けており、前年からのテストを解決しています)

+0

この宿題はありますか?その場合は、それに応じてタグを付けてください。 – tvanfosson

答えて

0

私はいいえ、現在の方法は大丈夫ではないと思います。

具体的には、タイプ0が入力され、入力を通過するとします。タイプ1は、タイプ0が出る前に来る。ミューテックスにヒットし、プロセスタイプが間違っていて、m1にロックされていることがわかります。タイプ0が入り、mのロックが解除され、プロセスタイプがリセットされ、m1のロックはまだ有効です。

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

「アップ」はロック解除に似ており、「ダウン」はロックに似ていると仮定しています。セマフォを対象とした一連のメソッドのように思えます。私はまた、システムに2つのミューテックス(mとm1)しかないと仮定しています。マークアップが完全にはっきりしていないためです。

EDIT:あなたが提供する提案がこのような何かに出てくるでしょう:

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) 
} 

これはまだ出口は状態の変更にスレッドセーフではないという問題があります。新しいプロセスが起床したり実行を開始したりすると、そのプロセスの兄弟は起きていないということです。

条件変数を使用せずにこれを行う安全な方法があるとは必ずしも言えません。利用可能な問題に関する詳細情報がない限り。 (つまり、メソッド実行が既にスレッドセーフである 'Monitor'のコンテキストではこれです)

0

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

カウンターを追加するのはどうですか? カウンタ== 0入力した場合、同じタイプの第一工程は入力== process.type (タイプを初期化する)出口における

:counter--及び(== 1カウント)場合、私はcheackます入力= -1となる。

+0

(私は私の答えを編集しました);カウンタを追加するといくつかの問題が修正されるかもしれませんが、すべての問題に対処するつもりはありません。私は、別のスレッディングコンストラクタなしでこれを安全に処理する方法がないと思っています。そして私はまだあなたがミューテックスよりむしろセマフォを使っていると思っています。 – CoderTao

関連する問題