为什么当我调用lock()时std::mutex会抛出异常?

问题描述 投票:0回答:2

如果我创建一个简单的程序,例如...

#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。

任何想法都值得赞赏。谢谢!

c++ mutex
2个回答
3
投票

互斥锁可能尚未初始化。如果此代码在

main
之前运行,请查看是否可以在不运行
main
之前的代码的情况下重现问题。


0
投票

在我的例子中,互斥体是其实例使用 malloc 初始化的结构的成员,导致互斥体的构造函数永远不会被调用,而是通过 new 调用分配构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.