C++ 为什么调用lock()时std::mutex会引发异常?

C++ 为什么调用lock()时std::mutex会引发异常?,c++,mutex,C++,Mutex,如果我创建一个简单的程序,如 #include <mutex> std::mutex gMutex; int main() { gMutex.lock(); gMutex.unlock(); return 0; } #包括 std::互斥gMutex; int main() { gMutex.lock(); gMutex.unlock(); 返回0; } 。。。代码执行时没有问题 但是,在另一个应用程序中,当我创建std::mutex的全局实例并尝试调

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

#include <mutex>

std::mutex gMutex;

int main()
{
    gMutex.lock();
    gMutex.unlock();
    return 0;
}
#包括
std::互斥gMutex;
int main()
{
gMutex.lock();
gMutex.unlock();
返回0;
}
。。。代码执行时没有问题

但是,在另一个应用程序中,当我创建
std::mutex
的全局实例并尝试调用
lock()
方法时,会引发异常。(我没有确切的异常文本,但它抱怨互斥对象的内部为null)

查看失败的互斥对象的内部状态,我看到
\u Mtx\u storage
成员将它的
\u Val
设置为
0.000000000000000000
,并且它的
\u Pad
成员设置为非空值,该值指向一个空字节的小缓冲区(我认为它的大小是0x4f字节)

当我将此状态与上面的简单程序中的状态进行比较时,我看到工作代码中的
\u Mtx_storage
状态不是null(我认为它是
0.000000000002
)。在我的其他应用程序中,什么会导致它为空

我使用Visual C++ 2015。< /P>


欢迎提出任何意见。谢谢

互斥锁可能尚未初始化。如果此代码在
main
之前运行,请查看是否可以在代码未在
main
之前运行的情况下复制此问题可能互斥体尚未初始化。如果此代码在
main
之前运行,请查看您是否可以在没有代码在
main
之前运行的情况下复制问题而不查看代码,这很难知道。我最好的猜测是初始化订单失败。(代码是否在
main
之前运行?如果是,您如何知道互斥锁是构建的?)内存损坏?已经锁好了吗?另一个线程释放了锁而没有保持它?我在一个.cpp文件(全局)中有一个互斥锁,在使用它的仅有两个函数(在同一个.cpp文件中定义)的上面。我在锁调用上有断点,所以我知道第一个调用失败了。您介意创建一个互斥锁来向我们展示吗?密码说的超过一百万个字。我会继续尝试。当我构建简单的测试来演示时,问题不会出现。这就像互斥结构在内部失败一样。如果在简化它时问题消失了,那么问题很可能出现在您删除的程序部分。尝试一次一步删除或简化代码。当程序重新开始工作时,您已经找到了代码中存在问题的部分,调试该部分或仅围绕该部分创建MCVE将更容易。如果没有看到代码,很难知道。我最好的猜测是初始化订单失败。(代码是否在
main
之前运行?如果是,您如何知道互斥锁是构建的?)内存损坏?已经锁好了吗?另一个线程释放了锁而没有保持它?我在一个.cpp文件(全局)中有一个互斥锁,在使用它的仅有两个函数(在同一个.cpp文件中定义)的上面。我在锁调用上有断点,所以我知道第一个调用失败了。您介意创建一个互斥锁来向我们展示吗?密码说的超过一百万个字。我会继续尝试。当我构建简单的测试来演示时,问题不会出现。这就像互斥结构在内部失败一样。如果在简化它时问题消失了,那么问题很可能出现在您删除的程序部分。尝试一次一步删除或简化代码。当程序重新开始工作时,您已经找到了代码中存在问题的部分,调试该部分或仅围绕该部分创建MCVE将更容易。事实确实如此。一位同事将代码签入到另一个源文件,该文件创建了两个静态对象(依赖于我的分配器类,其中包含有问题的互斥体),这些静态对象在互斥体之前被实例化,这导致了失败。我已将此添加到团队发展可能带来的惊喜列表中。:)非常感谢。事实确实如此。一位同事将代码签入到另一个源文件,该文件创建了两个静态对象(依赖于我的分配器类,其中包含有问题的互斥体),这些静态对象在互斥体之前被实例化,这导致了失败。我已将此添加到团队发展可能带来的惊喜列表中。:)非常感谢。