- PR -

Mutex名の働きについて教えてください

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-08-03 23:51
Mutex名の働きについて良く理解できません。
Mutexを構成する個々のインスタンスとMutex名の関係がごっちゃになって混乱しています。
両者の関係を整理しようと思い質問しました。アドバイス願います。

下記の理解で正しいでしょうか?誤っている部分があればご指摘願います。

(a)名前がついているMutexの効果

 (インスタンスのアクセス制御子がprivateであっても)スレッド間だけでなくプロセス間
 でも所有権が共有される。どのインスタンスであるかは意味が無くなり、Mutex名のみが
 キーとなる。

 例1
 (1) Process"1"のThread"a"で生成された private Mutex 1a = new Mutex(true,"test1");
 (2) Process"1"のThread"b"で生成された private Mutex 1b = new Mutex(true,"test1");
 (3) Process"2"のThread"c"で生成された private Mutex 2c = new Mutex(true,"test1");
 (4) Process"2"のThread"d"で生成された private Mutex 2d = new Mutex(true,"test2");

 (1)(2)(3)(4)の4つのインスタンスが同時に存在した場合、(1)(2)(3)間で1つの所有権を奪い合う。
 つまり、名前つきMutexの場合、どのインスタンス(この場合1a,1b,2c,2d)に所属するかに関わり無く、
 Mutex名(この場合"test1")が同じものどうしが1つの所有権を奪い合う。

(b)名前がついていないMutexの場合
 同じプロセスの複数のスレッド間でのみ参照される。キーとなるMutex名が無いので、どのインス
 タンスに所属するかで区別される。

 例2
 (1) Process"1"のThread"a"で生成された private Mutex x = new Mutex(true);
 (2) Process"1"のThread"b"で生成された x = new Mutex(true);
 (3) Process"1"のThread"c"で生成された private Mutex y = new Mutex(true);
 (4) Process"2"のThread"d"で生成された private Mutex z = new Mutex(true);
 ※(2)のインスタンスxは(1)と同じインスタンスを参照しているとする

 (1)(2)の2つの間で1つの所有権を奪い合う。この場合、インスタンスが違いは
 (この場合、xとyとz)は別の世界であり、相互に干渉しない。

WindowsTips等を読んだりしてみましたが、
Mutexのメカニズムについて腑に落ちません。よろしくお願いします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-08-04 00:03
それで会っています。
引用:

ひろしさんの書き込み (2005-08-03 23:51) より:
 例2
 (1) Process"1"のThread"a"で生成された private Mutex x = new Mutex(true);
 (2) Process"1"のThread"b"で生成された x = new Mutex(true);
 (3) Process"1"のThread"c"で生成された private Mutex y = new Mutex(true);
 (4) Process"2"のThread"d"で生成された private Mutex z = new Mutex(true);
 ※(2)のインスタンスxは(1)と同じインスタンスを参照しているとする


同じインスタンスを参照しているように表現したいなら、以下のように記述した方が誤解を与えないと思いますよ。少なくとも貴方の記述では、明らかに異なるインスタンスを生成しています。
 (2) Process"1"のThread"b"で生成された private Mutex w = x;

引用:

WindowsTips等を読んだりしてみましたが、
Mutexのメカニズムについて腑に落ちません。よろしくお願いします。


どのように腑に落ちないのかを説明してくれると、もう少し解説のしようもあると思うのですけど・・・。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-08-05 10:15
腑に落ちない点

例えば、App1.exeとApp2.exeが同時に実行されていたとすると、
Mutex名が同じなので、所有権の争奪が発生するという理解で正しいでしょうか?

App1.exe → Mutex mutex1 = new Mutex(true,"test"); を含んでいる
App2.exe → Mutex mutex2 = new Mutex(true,"test"); を含んでいる

上記理解で正しいとして、

他人が作成したWindowsアプリケーションは内部でどのようなMutex名を
使っているのか知る方法が無い。
Mutex名の衝突が発生しなことが保証できないため困ったことになる。
長い名前をつけて衝突の可能性を低く抑えるという消極的な方法しか無いのだろうか?

セキュリティーについて厳格な.NET FrameworkにおいてWindows全体に影響を及ぼしかねない
実装をMicrosoft社がするはずが無いような気がしている→つまり、Mutex名について私の理解が
誤っていると思えるのです。

質問1:名前付きMutexについての私の理解は正しいか?
質問2:衝突が発生しないMutex名を生成する方法はあるか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-08-05 10:43
引用:

ひろしさんの書き込み (2005-08-05 10:15) より:
他人が作成したWindowsアプリケーションは内部でどのようなMutex名を
使っているのか知る方法が無い。
Mutex名の衝突が発生しなことが保証できないため困ったことになる。
長い名前をつけて衝突の可能性を低く抑えるという消極的な方法しか無いのだろうか?


プロセス内で使用するMutexは同じインスタンスを共有すれば名前をつける必要は無いので、プロセス間で利用するMutexは限られるはずです。また名前が衝突する可能性に関しては、レジストリやファイル名でも同じことが言えます。ファイル名やレジストリでは現状問題となっていないですし、十分解決可能な問題だと思います。

引用:

セキュリティーについて厳格な.NET FrameworkにおいてWindows全体に影響を及ぼしかねない
実装をMicrosoft社がするはずが無いような気がしている→つまり、Mutex名について私の理解が
誤っていると思えるのです。


システムに問題を与えるようなアプリケーションをインストールしないのは管理者の責任となります。実際問題としてアプリケーションをインストールしてしまった場合、そのアプリケーションはWindowsのコアから自在に操ることが出来るのですから・・・

マルチユーザ環境ではユーザー毎に名前空間が分離していたり、アクセス権の設定で守られて居たりします。したがって不正に操作されて問題になるということは、基本的に無いはずです。

衝突を避けるためにはレジストリやProgramFilesの利用ルールに習って、"会社名_製品名_Mutexの名前"とでもするのが良いでしょう。

引用:

質問1:名前付きMutexについての私の理解は正しいか?


正しいと思います。
引用:

質問2:衝突が発生しないMutex名を生成する方法はあるか?


衝突を回避するための機能はありません。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-08-05 17:16
ご回答ありがとうございました。
Mutexが使えるようになりました。
1

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