如何解决将互斥体声明为静态的文件作用域变量是否安全?
| 根据http://msdn.microsoft.com/zh-cn/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中的错误。在EXE中有风险。如果在初始化具有静态存储持续时间的另一个对象的过程中调用了“ 1”(例如,“ 2”初始化单例),则该调用可以在“ 3”的初始化之前进行。初始化对象没有全局顺序。
, 编写的代码不会进入有人在等待时关闭手柄的情况,因为您永远不会合上手柄。进程终止后,该句柄将被关闭,但是您不必等待它(该特定的句柄),然后根据定义。
HANDLE
没有非平凡的析构函数,因此不会自行关闭。当然,哪一个本身可能是有问题的,但这与您似乎担心过早关闭手柄是一个不同的问题。建议您退后一步,并确保您了解要完成的工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。