2012-04-24 236 views
2

我認爲這兩個函數將返回相同的內核句柄。 我寫一個測試程序來證明我的觀點:CreateMutex()和OpenMutex()返回不同的句柄

在我的節目,我創建一個名字內核句柄「_MYTEST」

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

然後我開始一個線程,該線程與打開上面的把手以下代碼:

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

當我運行程序時,發現兩個返回值不相等! hHandle2的值比hHandle1的值大4。 爲什麼?我的代碼中是否有任何問題?如果不是,爲什麼這兩個值不相等?

+0

這是完全正常的,與打開同一文件兩次沒有區別。關閉其中一個手柄不會關閉另一個手柄。那會很糟糕。 – 2012-04-24 02:46:31

回答

3

句柄不是對象,它是一個存儲在內核中的描述符,它將一個僅在程序地址空間中有效的值映射到內核對象。

這是一個漫長的說法:互斥體的句柄不是互斥體本身。僅僅因爲句柄不同並不意味着下面的互斥體。

這類似於C創建兩個不同的指向一個物體,然後比較指針(VS的指針的內容),以錯誤地推斷出的對象的地址是不一樣的。

+0

我明白了。謝謝您的回答! – Lee 2012-04-24 03:26:03

0

這是按設計工作的。信號量的「連接點」處於比由CreateMutexOpenMutex返回的句柄低的水平。

換句話說,或者句柄將引用相同的底層互斥體,它由名稱(第三個參數)指定。

如果您有每個線程鎖定其各自的句柄,打印一條消息,等待十秒鐘然後將其解鎖,您會看到此內容。

其中一個線程將不會打印任何內容,直到另一個線程解鎖其手柄並允許第二個鎖繼續。

+0

我會盡力的,謝謝! – Lee 2012-04-24 03:26:56

相關問題