考虑以下代码:
#include <Windows.h>
test(HANDLE*hB0)
{
printf("hello "), ReleaseMutex(*hB0);
}
main()
{
HANDLE hB0;
CreateThread(0,0,test,(hB0=CreateMutex(NULL,true,NULL),&hB0),0,0),
WaitForSingleObject(hB0, INFINITE),
printf("world!");
}
我期待得到你好世界!但我刚刚走向世界!代替。有什么想法吗?
我尝试使用第二个参数CreateMutex都是true和false但它仍然无法正常工作。
来自CreateMutex
的功能
拥有互斥锁的线程可以在重复的等待函数调用中指定相同的互斥锁,而不会阻止其执行
在电话中
hB0=CreateMutex(NULL,true,NULL)
bInitialOwner = TRUE
所以你当前的线程拥有互斥锁,结果WaitForSingleObject(hB0, INFINITE)
只返回没有阻塞执行。
从另一方面,如果线程,不拥有互斥,调用ReleaseMutex
- 将返回错误ERROR_NOT_OWNER
- 尝试释放不属于调用者的互斥锁。或本机状态STATUS_MUTANT_NOT_OWNED
尝试释放突变对象是由一个不是突变对象所有者的线程。 - 但是你没有检查功能结果和错误代码。
也因为你定义test(HANDLE*hB0)
- 你需要调用ReleaseMutex(*hB0);
而不是ReleaseMutex(hB0);
。然而更好的传递hB0
句柄直接以线程作为参数,而不是指针&hB0
来处理。