Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将互斥体声明为静态文件范围的变量安全吗?_C++_Windows - Fatal编程技术网

C++ 将互斥体声明为静态文件范围的变量安全吗?

C++ 将互斥体声明为静态文件范围的变量安全吗?,c++,windows,C++,Windows,根据,如果句柄在等待时关闭,WaitForSingleObject()具有未定义的行为 因为我们不能告诉静态变量的处理顺序,所以将互斥声明为具有文件作用域的静态变量安全吗 namespace { static HANDLE g_hMutex = CreateMutex(NULL, FALSE, NULL); } int CMyClass::Foo() //CMyClass is a singleton { int ret = 0; if (WaitForSingleOb

根据,如果句柄在等待时关闭,WaitForSingleObject()具有未定义的行为

因为我们不能告诉静态变量的处理顺序,所以将互斥声明为具有文件作用域的静态变量安全吗

namespace
{
    static HANDLE g_hMutex = CreateMutex(NULL, FALSE, NULL);
}

int CMyClass::Foo() //CMyClass is a singleton
{
    int ret = 0;
    if (WaitForSingleObject(g_hMutex, 1000) != WAIT_OBJECT_0)
        return -1;

    //Do something

    ReleaseMutex(g_hMutex);
    return ret;
}

谢谢

在命名空间范围内调用任何Win32 API函数时,我都会非常谨慎。另外,既然您必须在函数中释放它,为什么不在那里分配它呢?这样会更加对称。

这是DLL中的一个错误。在前男友那里很危险。如果在初始化另一个具有静态存储持续时间的对象时调用了
CMyClass::Foo()
(例如
CMyClass::CMyClass
初始化单例),则该调用可能会在初始化
g_hMutex
之前进行。对象初始化没有全局顺序。

编写的代码不会出现有人在等待句柄时关闭句柄的情况,因为您从未关闭句柄。进程终止后,句柄将关闭,但根据定义,您没有等待它(特定句柄)


句柄
没有非平凡的析构函数,因此它不会自行关闭。当然,这本身就有问题,但这与你似乎担心的过早关闭手柄是不同的问题。我建议你后退一步,确保你了解你想要完成的事情。

全局对象(带有构造函数)和在WINmain(或main)调用之前运行的代码是一个坏习惯。在C++程序中的@ SelBee WINMain与Windows加载程序调用的主函数不一样。