C++ 将互斥体声明为静态文件范围的变量安全吗?
根据,如果句柄在等待时关闭,WaitForSingleObject()具有未定义的行为 因为我们不能告诉静态变量的处理顺序,所以将互斥声明为具有文件作用域的静态变量安全吗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
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加载程序调用的主函数不一样。