2011-06-25 46 views
4

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

谢谢!

回答

1

我会非常乐意致电任何 Win32 API函数在命名空间范围。另外,既然你必须在你的函数中释放它,为什么不在那里分配呢?这种方式更对称。

+0

调用WinMain(或main)之前运行的全局对象(带构造函数)和代码是一个不好的习惯。 – selbie

+0

在您的C++程序中,@selbie WinMain与Windows加载器调用的主函数不同。 –

0

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

0

写入的代码不会陷入某人因为您从不关闭句柄而有人在等待时关闭句柄的情况。在进程终止后,句柄将被关闭,但是你并没有等待它(那个特定的句柄),然后根据定义。

HANDLE没有非平凡的析构函数,所以它不会自行关闭。当然,这本身可能会带来问题,但这与您似乎关心的太快关闭手柄存在不同的问题。我建议你退后一步,并确保你明白你想要完成什么。