我尝试摆脱代码中的一些 boost 依赖项,转而使用新的 C++11 功能(Visual Studio 2013)。
在我boost::mutex
一起使用的一个组件中boost::lock_guard<boost::mutex>
,一切正常。相反,当我std::mutex
与 with 一起使用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
只能和s一起使用,和std::thread
s不兼容boost::thread
?
编辑:
我注意到的另一件事是:当我卸载动态加载的共享库时,这需要一些时间。(DLL 访问硬件,需要一些时间才能完全关闭所有内容)。但是,当我切换到std::mutex
时,看起来 DLL 几乎可以立即卸载,但是当从main()
. 我的印象是,问题出std::mutex
在 DLL 的上下文中。
编辑2:
应用程序和 DLL 都是使用 v120 工具集在调试配置中全新构建的,并与运行时库 (/MTd) 静态链接。
编辑3:
您可以在下面找到调用堆栈。异常似乎来自驱动程序的某个地方。只是偶然我发现它与我使用的互斥锁实现有关。
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()
编辑4:
也许这是 OpenNI2 SDK 中的一个错误,只能在这些非常特定的条件下观察到。所以我在这个问题中添加了 openni 标签。但问题仍然存在:为什么它适用于boost::mutex
但不适用std::mutex
?