Rob*_*ner 10 mutex unhandled-exception openni c++11 boost-mutex
我试图摆脱代码中的一些boost依赖项,而是使用新的C++ 11特性(Visual Studio 2013).
在我的组件之一我曾经boost::mutex一起boost::lock_guard<boost::mutex>和一切工作正常.当我std::mutex一起使用时std::lock_guard<std::mutex>,我从返回时收到以下错误main().
GrabberTester.exe中0x7721E3BE(ntdll.dll)的未处理异常:0xC0000005:访问冲突读取位置0xA6A6B491.
真正的项目非常复杂,因此难以提供完整的工作代码示例来重现此问题.在我的真实项目中,互斥体用在一个在运行时加载的共享库中(但是在我返回时应该已经卸载了它main()).
我的问题是:
boost::mutex和std::mutex设计表现完全相同?std::mutex代替boost::mutex?boost::thread框架创建线程.可能std::mutex只能用于std::threads并且与boost::threads 不兼容吗?我注意到的另一件事是:当我卸载动态加载的共享库时,这需要一些时间.(DLL访问硬件,干净地关闭所有内容需要一些时间).当我切换到std::mutex它时,看起来几乎可以立即卸载DLL,但程序然后在返回时崩溃main().我的印象是问题std::mutex特别是在DLL的上下文中.
应用程序和DLL都是使用v120工具集在Debug配置中新建的,并与运行时库(/ MTd)静态链接.
下面你可以找到callstack.例外似乎来自驱动程序中的某个地方.只是偶然我发现它与我使用的互斥锁的实现有关.
ntdll.dll!7721e3be()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7721e023()
kernel32.dll!76b014ad()
msvcr100.dll!71b0016a()
PS1080.dll!oniDriverDestroy() Line 29
OpenNI2.dll!oni::implementation::DeviceDriver::~DeviceDriver() Line 95
OpenNI2.dll!oni::implementation::Context::shutdown() Line 324
OpenNi2Grabber.dll!openni::OpenNI::shutdown() Line 2108
OpenNi2Grabber.dll!GrabberSingletonImpl::~GrabberSingletonImpl() Line 46
OpenNi2Grabber.dll!`GrabberSingletonImpl::getInstance'::`2'::`dynamic atexit destructor for 'inst''()
OpenNi2Grabber.dll!doexit(int code, int quick, int retcaller) Line 628
OpenNi2Grabber.dll!_cexit() Line 448
OpenNi2Grabber.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 169
OpenNi2Grabber.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 399
OpenNi2Grabber.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 340
ntdll.dll!7722b990()
ntdll.dll!77249bad()
ntdll.dll!77249a4f()
kernel32.dll!76b079ed()
GrabberTester.exe!__crtExitProcess(int status) Line 776
GrabberTester.exe!doexit(int code, int quick, int retcaller) Line 678
GrabberTester.exe!exit(int code) Line 417
GrabberTester.exe!__tmainCRTStartup() Line 264
GrabberTester.exe!mainCRTStartup() Line 165
kernel32.dll!76b0338a()
ntdll.dll!7722bf32()
ntdll.dll!7722bf05()
Run Code Online (Sandbox Code Playgroud)
也许这是OpenNI2 SDK中的一个错误,只有在这些特定条件下才能观察到.所以我在这个问题上添加了openni标签.但问题仍然存在:它为什么会合作boost::mutex但不合作std::mutex?
最有可能的问题是静态init地狱,我最近经历了几乎同样的事情.这是下来的事情:
问题是你并不真正知道静态对象的破坏顺序.所以如果你有:
static std::mutex staticMutex;
void someFunction()
{
std::unique_lock<std::mutex> lock(staticMutex);
doSomethingAwesome();
}
Run Code Online (Sandbox Code Playgroud)
....
StaticObjA::~StaticObjA()
{
someFunction();
}
Run Code Online (Sandbox Code Playgroud)
然后,当调用~SpaticObjA()时,您的静态互斥锁CAN已被删除/销毁/ deadbeef.当对象在不同的编译单元中定义时(即在不同的文件中定义),问题会加剧.
我的解决建议是尝试减少对静态对象的依赖,你可以尝试使用一个静态对象来处理其他所有内容的构造/破坏,这样就可以控制事件的顺序.或者根本就不要使用静力学.