考虑这段代码:
#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!");
}
我期待得到 Hello World !但我刚刚得到世界!反而。有什么想法吗?
我尝试将 CreateMutex 的第二个参数设置为 true 和 false,但它仍然无法正常工作。
最佳答案
来自 CreateMutex
功能
The thread that owns a mutex can specify the same mutex in repeated wait function calls without blocking its execution
通话中
hB0=CreateMutex(NULL,true,NULL)
bInitialOwner = TRUE
因此您的当前线程拥有互斥量,结果 WaitForSingleObject(hB0, INFINITE)
只是返回而不阻塞执行。
如果不拥有互斥量的线程从另一端调用 ReleaseMutex
- 将返回错误 ERROR_NOT_OWNER
- 尝试释放不属于调用者的互斥量。 或 native 状态 STATUS_MUTANT_NOT_OWNED
尝试释放突变对象的线程不是突变对象的所有者。 - 但您不检查函数结果和错误代码。
还因为您定义了 test(HANDLE*hB0)
- 您需要调用 ReleaseMutex(*hB0);
而不是 ReleaseMutex(hB0);
.然而,最好将 hB0
句柄作为参数直接传递给线程,而不是将指针 &hB0
传递给句柄。
关于c - 简单的互斥应用程序无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55767182/