2011-02-25 17 views
3

私はCreateMutexを呼び出します。CreateMutexの混乱

リリースミューテックスが右呼び出されるまで、機能createmutexに到達する最初のスレッドは、本質的に、ブロック、私は実行中の複数のスレッドを持つ//ランダムなコードセクションから他の全てのスレッドを想定し
HANDLE h; 
h=CreateMutex(NULL, TRUE, NULL); 
waitforsingleobject(h, INFINITE); 
////Random Code 
ReleaseMutex(h); 

+0

実現しますか単一のプロセス内のスレッド? –

答えて

13

名前のないミューテックスを作成したので(3番目のパラメータは名前です)、そうではありません。サンプルコードが複数のスレッドで実行されていると仮定すると、各スレッドは新しい名前のないミューテックスを作成し、クリティカルセクション(ランダムコード)にアクセスします。

これを修正するには、すべてのスレッドがアクセスできるグローバルハンドルを指定し、CreateMutexを共有コードの外に一度呼び出すか、CreateMutexに名前(第3引数)を指定します。後者の場合、CreateMutexを呼び出すと、既存のmutexへのハンドルが返されます。

1

mutexの名前を指定しないので、各スレッドは独自の別個のmutexを作成します。他のスレッドは認識しません。

あなたのシナリオでは、クリティカルセクションを選択することをお勧めします。

0

同じmutex参照がすべてのスレッド/プロセスで共有されている場合のみです。あなたはそれを共有していない、あなたはそれを毎回作成しています。彼らはあなたのコードが動作するために同じミューテックスを得るように名前を付ける必要があります。

1

無名ミューテックスを作成することを考慮すると、各スレッドは名前のないミューテックスを作成し、作成時に所有権を引き継ぎます。各スレッドには独自のミューテックスがあるため、すべてのスレッドを並列に実行できます。

名前を付けたくない場合は、すべてのスレッドに対してmutexを一度作成する必要があります。あなたのコードを見て、ミューテックスの作成が成功したかどうかもチェックしてください。

次に、複数のスレッドから呼び出される関数では、以前に作成されたmutexのWaitForSingleObjectを呼び出します。

ミューテックスの所有権があるか、またはミューテックスが放棄されたため待機が終了したために返された場合、返された結果を確認してください。

オーナーシップを持っている場合は、必ずミューテックスハンドルでReleaseMutexを呼び出してください。おそらく、例外が発生したとき、またはReleaseMutexの前にreturn文が挿入されたときにmutexが適切に解放されることを確認するために、RAIIを使用してmutexを管理することを考えてください。

ミューテックスが不要になったときに、MutexHandleでCloseHandleを呼び出すことを必ず確認してください。ミューテックスを使用する方法を示す例

はこちらを参照してください。基本的なマルチスレッドラップのために"Using Mutex Objects"

はここを参照してください:あなたは、このロックがためである場合は、クリティカルセクションを持つ方が良いだろうとUsing Threads