2

2 つの関数は同じカーネル ハンドルを返すと思います。そして、私の見解を証明するためにテストプログラムを書きます:

私のプログラムでは、'_MYTEST' という名前のカーネル ハンドルを作成します。

hHandle1 = CreateMutex(NULL, false, _T("_MYTEST"));

次に、スレッドを開始し、次のコードを使用してこのスレッドで上記のハンドルを開きます。

hHandle2 = OpenMutex(MUTEX_ALL_ACCESS, false, _T("_MYTEST"));

プログラムを実行すると、2 つの戻り値が等しくないことがわかりました。hHandle2 の値は、hHandle1 の値よりも 4 大きくなります。なぜ?私のコードに何か問題がありますか?そうでない場合、2 つの値が等しくないのはなぜですか?

4

2 に答える 2

3

ハンドルはオブジェクトではなく、プログラムのアドレス空間でのみ有効な値をカーネルオブジェクトにマッピングするカーネルに格納された記述子です。

それは長い言い方です。ミューテックスへのハンドルはミューテックス自体ではありません。ハンドルが異なるからといって、その下のミューテックスが異なるという意味ではありません。

これは、Cで1つのオブジェクトへの2つの異なるポインターを作成し、ポインターのアドレス(ポインターの内容との比較)を比較して、オブジェクトが同じではないと誤って推測するようなものです。

于 2012-04-24T02:45:59.717 に答える
0

これは設計どおりに機能しています。CreateMutexセマフォの「接続ポイント」は、またはによって返されるハンドルよりも低いレベルにありOpenMutexます。

つまり、どちらのハンドルも、名前(3番目の引数)で指定された同じ基になるミューテックスを参照します。

各スレッドにそれぞれのハンドルをロックさせ、メッセージを印刷し、10秒間待ってからロックを解除すると、これが表示されます。

スレッドの1つは、もう1つがハンドルのロックを解除し、2番目のロックが続行できるようになるまで、何も印刷しません。

于 2012-04-24T02:46:17.483 に答える