根据http://msdn.microsoft.com/en-us/library/ms687032%28v=vs.85%29.aspx,如果句柄在等待时被关闭,则WaitForSingleObject()具有未定义的行为。
因为我们无法告诉静态变量的处理顺序,将mutex声明为具有文件范围的静态变量是否安全?
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;
}
谢谢!
答案 0 :(得分:1)
我非常谨慎地在命名空间范围内调用任何 Win32 API函数。另外,既然你必须在你的功能中释放它,为什么不在那里分配呢?这种方式更加对称。
答案 1 :(得分:0)
这是DLL中的错误。它在EXE中存在风险。如果在具有静态存储持续时间的另一个对象(例如CMyClass::Foo()
初始化单例)的初始化期间调用CMyClass::CMyClass
,则该调用可能先于g_hMutex
的初始化。没有初始化对象的全局顺序。
答案 2 :(得分:0)
编写的代码不会进入有人在等待它时关闭句柄的情况,因为你从不关闭句柄。在进程终止后句柄将被关闭,但你不是在等它(那个特定的句柄)然后按照定义。
HANDLE
没有非平凡的析构函数,所以它不会自行关闭。当然这当然可能有问题,但这与你似乎关注的过早关闭句柄的问题不同。我建议你退后一步,确保你理解你想要完成的任务。