将互斥对象声明为静态文件范围的变量是否安全

Is it safe to declare a mutex as a static file-scoped variable?

本文关键字:范围 变量 是否 安全 文件 静态 对象 声明      更新时间:2023-10-16

根据http://msdn.microsoft.com/en-us/library/ms687032%28v=vs.85%29.aspx,如果句柄在等待时关闭,则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的初始化。没有初始化对象的全局顺序。

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

HANDLE没有一个非平凡的析构函数,所以它不会关闭自己。当然,这本身就可能有问题,但这与你似乎担心的过早关闭手柄是不同的问题。我建议你退一步,确保你明白自己想要完成什么。