我认为这两个函数将返回相同的内核句柄。 我写了一个testing程序来certificate我的观点:
在我的程序中,我创build了一个名称为“_MYTEST”的内核句柄
hHandle1 = CreateMutex(NULL, false, _T("_MYTEST"));
然后我开始一个线程,并打开上面的线程与以下代码:
hHandle2 = OpenMutex(MUTEX_ALL_ACCESS, false, _T("_MYTEST"));
当我运行程序时,我发现两个返回值是不相等的! hHandle2的值比hHandle1的值大4。 为什么?在我的代码中是否有任何问题?如果不是,为什么这两个值不相等?
句柄不是对象,它是一个存储在内核中的描述符,它将一个只在程序的地址空间中有效的值映射到内核对象。
这是一个漫长的说法:对互斥体的处理不是互斥体本身。 只是因为句柄是不同的,并不意味着底下的互斥体。
这就像在C中创建两个不同的指向一个对象的指针,然后比较指针的地址 (与指针的内容)来错误地推导出对象是不一样的。
这是按照设计工作的。 信号量的“连接点”的级别低于CreateMutex
或OpenMutex
返回的句柄。
换句话说, 任何一个句柄都会引用相同的底层互斥体,这是由名称(第三个参数)指定的。
你会看到这个,如果你有每个线程锁定各自的句柄,打印一条消息,等待十秒钟,然后解锁它。
其中一个线程将不会打印任何东西,直到另一个线程解锁其手柄,并允许第二个锁继续进行。