- PR -

Mutexを生成時の初期所有権について

1
投稿者投稿内容
らら
常連さん
会議室デビュー日: 2005/01/21
投稿数: 28
お住まい・勤務地: 埼玉県
投稿日時: 2005-05-28 17:57
お世話になっています。

今、C#で開発しています。
親プロセスと複数の子プロセスが常駐起動していて、親プロセスから「終了するよ」というシグナルを子プロセスに伝えて子プロセスが終了するまで待つというプログラムをMutexクラスを利用して作成しました。

そこで質問なのですが、
Mutexのコンストラクタの1つである、
public Mutex(bool, string);
の1番目の引数であるboolには呼び出し元に初期所有権を与えるかどうかを指定するとなっています。
true→初期所有権与える
false→初期所有権与えない
だと思っているのですが、falseに設定しても所有権が与えられているみたいです。
(もうひとつのコンストラクタの3番目のoutパラメータで確認しました)

もしかして、もし二つのプロセスがあってそれぞれが同じMutexを生成した時に所有権をもらえるのは、早く生成したプロセスということなのでしょうか。

ご存知の方、ご教授よろしくお願いします。
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-05-29 00:30
南部です。

私も詳しいわけではありませんが、、、

引用:

ららさんの書き込み (2005-05-28 17:57) より:
true→初期所有権与える
false→初期所有権与えない
だと思っているのですが、falseに設定しても所有権が与えられているみたいです。
(もうひとつのコンストラクタの3番目のoutパラメータで確認しました)


falseの場合は所有権は付与されません。

確かにヘルプには、3番目の引数について
「 呼び出し元のスレッドにミューテックスの初期所有権が付与された場合は true の Boolean 値が格納されます。それ以外の場合は false が格納されます。」
とありますが、実際はMutexを作成したかどうかのフラグのようです。
なので、所有権が付与されたかどうかの条件は
「initiallyOwned(第1引数) && createdNew(第3引数)」
となります。

引用:

もしかして、もし二つのプロセスがあってそれぞれが同じMutexを生成した時に所有権をもらえるのは、早く生成したプロセスということなのでしょうか。


既に調査済みだとは思いますが、
1番目の引数がtrueの場合は、Mutexオブジェクト生成時に所有権を要求しますが、
1番目の引数がfalseの場合は、WaitOneを実行時に所有権を要求します。

コード:
bool initiallyOwned = false;
bool createdNew = false;

Mutex mutex = new Mutex(initiallyOwned, "MyMutex", out createdNew);
if(!(initiallyOwned && createdNew)) 
{
    mutex.WaitOne();
}

//なんかの処理

mutex.ReleaseMutex();



らら
常連さん
会議室デビュー日: 2005/01/21
投稿数: 28
お住まい・勤務地: 埼玉県
投稿日時: 2005-05-30 12:30
南部さん わかりやすいご回答ありがとうございました。

とても理解できました。そして、実現したいことをすることができました。

プロセス間でシグナルのやりとりをしたいので、1番目の引数はfalse にしてMutexを生成し、
所有権を持たせたいプロセスに、WaitOneメソッドで所有権を与える形にしたら実現できました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)