2

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

在我的程序中,我创建了一个名为“_MYTEST”的内核句柄

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

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

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

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

4

2 回答 2

3

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

这就是说的很长的方式:互斥锁的句柄不是互斥锁本身。仅仅因为句柄不同并不意味着下面的互斥锁是不同的。

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

于 2012-04-24T02:45:59.717 回答
0

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

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

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

一个线程不会打印任何东西,直到另一个线程解锁它的句柄并且允许第二个锁继续进行。

于 2012-04-24T02:46:17.483 回答