将互斥对象声明为静态文件范围的变量是否安全
Is it safe to declare a mutex as a static file-scoped variable?
根据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
没有一个非平凡的析构函数,所以它不会关闭自己。当然,这本身就可能有问题,但这与你似乎担心的过早关闭手柄是不同的问题。我建议你退一步,确保你明白自己想要完成什么。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 如果非动态变量被指针引用,何时超出范围?
- 为什么我的变量存在于其范围之外
- 变量超出范围后如何保留向量值?
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在 c++ 中确定堆栈上的变量范围
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何从未知视图中声明范围::v3::View 变量
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 是否未定义将对函数范围变量的引用作为值返回
- 无法从另一个函数访问文件范围变量的内容
- 如何访问C 中的功能范围变量
- C++ 程序和范围变量
- 性能对象属性与范围变量
- 存储lambda函数,该函数将范围变量捕获为类成员以供重用
- 何时分配块范围变量
- 在 c++ 中声明一个全局范围变量 const