如果我创建一个简单的程序,例如...
#include <mutex>
std::mutex gMutex;
int main()
{
gMutex.lock();
gMutex.unlock();
return 0;
}
...代码执行没有问题。
但是,在另一个应用程序中,当我创建
std::mutex
的全局实例并尝试调用 lock()
方法时,会引发异常。 (我没有确切的异常文本,但它抱怨互斥对象的内部为空)
查看失败的互斥对象的内部状态,我发现
_Mtx_storage
成员将其 _Val
设置为 0.000000000000000000
并且其 _Pad
成员设置为非空值,该值指向一个小的值空字节的缓冲区(我认为它的大小是 0x4f 字节)。
当我将此状态与上面的简单程序中的状态进行比较时,我发现代码中的
_Mtx_storage
状态不为空(我认为它是 0.000000000002
)。什么会导致它在我的其他应用程序中为空?
我正在使用 Visual C++ 2015。
任何想法都值得赞赏。谢谢!
互斥锁可能尚未初始化。如果此代码在
main
之前运行,请查看是否可以在不运行 main
之前的代码的情况下重现问题。
在我的例子中,互斥体是其实例使用 malloc 初始化的结构的成员,导致互斥体的构造函数永远不会被调用,而是通过 new 调用分配构造函数。