ミューティックスの所有権を同じスレッドから何度も得ようとするとどうなるか
題名からしてわかりにくいので、まずはそれについて説明。
Mutex(ミューティックス)は同期オブジェクト(synchronization object)の一つです。
これの所有権を得るにはWaitFunctionsと呼ばれる関数(*1)を呼び出し、所有権を解放するときにはReleaseMutex関数を呼び出します。
じゃあこの待機する関数(WaitFunctions)を、同じmutexに対して2回呼び出してしまったらどうなるか。
例えばある関数が所有権を得て、さらにその関数が呼び出した別の関数でも所有権を得ようとした場合など。
結論
どうなるか? → 何回呼んでも所有権を得られる(限界はあるだろうけど)
解放の方法 → 待機する関数(WaitFunctions)を呼んだ回数だけReleaseMutex関数を呼び出す
これ以上に簡単な説明は無いです。
少し詳しく
既にそのスレッドが所有権を得ているmutexを指定して、さらに待機関数を呼ぶことができます。
なので既に自分に所有権のあるmutexを、解放されるまで待とうとして固まってしまうことはない。
だけど所有権を解放するために、スレッドはReleaseMutex関数を、待機関数を呼び出した数だけ呼ばなければいけません。
要はWaitForSingleObject関数やWaitForMultipleObjects関数を呼んだ数だけReleaseMutexも呼ばなければいけない。
(CreateMutex関数で、作った瞬間に所有権を得た場合はそれも数える。)
(MSDN EN Mutex Objects)
簡単な話、ブロックの初めと終わりに所有権を得る関数と解放する関数を置けばいい。(そして最後にはCloseHandleする。)
ただしその場合、ブロックの途中でbreakやreturnしてはいけないので、そうではなく、デストラクタで自動的に解放処理を行ってくれるクラスがあるといいです。
そんなことがEffective C++ 第3版に書いてありました。また、mutexそのものや同期オブジェクトについての情報は「APIで学ぶWindows徹底理解」という書籍もどき(いわゆるムック)から。
APIで学ぶWindows徹底理解 (日経BPパソコンベストムック)
- 作者: 安室浩和,日経ソフトウエア編
- 出版社/メーカー: 日経BP社
- 発売日: 2004/04/15
- メディア: 雑誌
- 購入: 17人 クリック: 240回
- この商品を含むブログ (33件) を見る
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: スコット・メイヤーズ,小林健一郎
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2006/04/29
- メディア: 大型本
- 購入: 29人 クリック: 411回
- この商品を含むブログ (186件) を見る
*1:SignalObjectAndWait, WaitForSingleObject, WaitForSingleObjectEx, WaitForMultipleObjects, WaitForMultipleObjectsEx, MsgWaitForMultipleObjects, MsgWaitForMultipleObjectsEx関数がある