c - 简单的互斥应用程序无法正常工作?

标签 c winapi mutex

考虑这段代码:

#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/

相关文章:

C++ Checkbox 的行为类似于单选按钮 WINAPI(无 MFC)

winapi - Windows 7 SDK安装失败

c# - c#中的互斥量和信号量是什么?我们需要在哪里实现?

c - 水印图片上C点水印功能

c - 移位是否取决于字节序?

c++ - 不使用 Visual C++ 编译 c++ Visual C++ 7.1 解决方案

c - 为什么 cpp 告诉我 'undefined reference to mtx_init' ?我已经包含标题

linux - 为什么 gdb 中的 pthread_mutex_t 结构全为零?

c - mingw c 编译

c++ - 将 RFC 822 时间戳转换为 unixtime,时区值不起作用,C/C++