我试图在代码中摆脱一些 boost 依赖,而是使用新的 C++11 特性(Visual Studio 2013)。
在我的一个组件中,我使用 boost::mutex
和 boost::lock_guard<boost::mutex>
,一切正常。但是当我改用 std::mutex
和 std::lock_guard<std::mutex>
时,当从 main()
返回时发生以下错误:
Unhandled exception at 0x7721E3BE (ntdll.dll) in GrabberTester.exe: 0xC0000005: Access violation reading location 0xA6A6B491.
实际项目非常复杂,因此很难提供完整的工作代码示例以重现此问题。 在我的实际项目中,互斥量在运行时加载的共享库中使用(但应该在我从 main()
返回时卸载)。
我的问题是:
boost::mutex
和std::mutex
是否被设计为绝对相同的行为?- 如果不是,则有什么区别? 当使用
std::mutex
而不是boost::mutex
时,需要注意什么? - 在共享库中,我正在使用
boost::thread
框架创建线程。std::mutex
只能与std::thread
一起使用,并且与boost::thread
不兼容吗?
编辑:
我还注意到一件事:当我卸载动态加载的共享库时,这需要一些时间。(DLL 访问硬件,需要一些时间才能干净地关闭所有内容)。 但是当我切换到 std::mutex
时,似乎 DLL 几乎可以立即卸载,但程序在从 main()
返回时崩溃。 我有这样的印象,即 std::mutex
的问题特别出现在 DLL 的上下文中。
编辑 2:
应用程序和 DLL 都使用 v120 工具集以 Debug 配置进行全新构建,并静态链接了运行时库(/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的一个bug,只有在这些非常特定的情况下才能观察到。所以我将openni标签添加到了这个问题中。但问题仍然存在:为什么它可以使用boost::mutex
而不是std::mutex
?
mutex
是否包含在其中。 - T.C.