CreateMutex()和OpenMutex()返回不同的句柄

时间:2012-04-24 02:28:37

标签: windows

我认为这两个函数将返回相同的内核句柄。 我写了一个测试程序来证明我的观点:

在我的程序中,我创建了一个名为'_MYTEST'的

的内核句柄
hHandle1 = CreateMutex(NULL, false, _T("_MYTEST"));

然后我启动一个线程并使用以下代码在此线程中打开上面的句柄:

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

当我运行程序时,我发现两个返回值不相等! hHandle2的值比hHandle1的值大4。 为什么?我的代码中是否有任何问题?如果没有,为什么这两个值不相等?

2 个答案:

答案 0 :(得分:3)

句柄不是对象,它是存储在内核中的描述符,它将一个仅在程序的地址空间中有效的值映射到内核对象。

这是很长的说法:互斥体的句柄不是互斥体本身。仅仅因为手柄不同并不意味着下面的互斥体是。

这就像在C中创建两个不同的指向一个对象的指针,然后比较指针的地址(与指针的内容相对)来错误地推断出对象是不一样的。

答案 1 :(得分:0)

这是按设计工作的。信号量的“连接点”低于CreateMutexOpenMutex返回的句柄。

换句话说, 句柄将引用相同的底层互斥锁,它由名称(您的第三个参数)指定。

如果您让每个线程锁定各自的句柄,打印一条消息,等待十秒钟然后将其解锁,您就会看到这一点。

其中一个线程不会打印任何东西,直到另一个线程解锁其手柄并允许第二个锁定继续。