将互斥锁声明为静态文件范围变量是否安全?

时间:2011-06-25 03:20:56

标签: c++ windows

根据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;
}

谢谢!

3 个答案:

答案 0 :(得分:1)

我非常谨慎地在命名空间范围内调用任何 Win32 API函数。另外,既然你必须在你的功能中释放它,为什么不在那里分配呢?这种方式更加对称。

答案 1 :(得分:0)

这是DLL中的错误。它在EXE中存在风险。如果在具有静态存储持续时间的另一个对象(例如CMyClass::Foo()初始化单例)的初始化期间调用CMyClass::CMyClass,则该调用可能先于g_hMutex的初始化。没有初始化对象的全局顺序。

答案 2 :(得分:0)

编写的代码不会进入有人在等待它时关闭句柄的情况,因为你从不关闭句柄。在进程终止后句柄将被关闭,但你不是在等它(那个特定的句柄)然后按照定义。

HANDLE没有非平凡的析构函数,所以它不会自行关闭。当然这当然可能有问题,但这与你似乎关注的过早关闭句柄的问题不同。我建议你退后一步,确保你理解你想要完成的任务。