std::unique_lock<std::mutex> 禁止 DLL 卸载
std::unique_lock<std::mutex> prohibit dll unloading
我有一个问题,而卸载dll。它和这个很像,但完全不同。我正在使用LoadLibraryA加载一个dll,然后调用一个函数并使用FreeLibrary关闭dll。然而,dll没有被卸载,但是FreeLibrary返回success。减少代码:
void foo() {
std::unique_lock<std::mutex> lock(mtx_);
}
在调试代码并查看进程资源管理器时,unique_lock创建了第二个线程,但是为什么要?而且,只要应用程序运行,这个线程就会运行。没有别的了;没有其他的dll句柄,没有其他函数。此外,dll仍然加载在程序中。如果我去掉上面的线,一切都没问题。dll很好地卸载了,没有额外的线程。所以我的问题是,如何避免这种行为,为什么unique_lock创建一个线程?
互斥锁用于多线程,但在测试时,只有一个线程,加载调用foo的dll,并卸载dll。
编辑:
我不知道这是否是互斥锁/unique_lock的visual studio实现中的错误,但我通过使用boost的互斥锁/unique_lock解决了这个问题。
这是Visual Studio中的一个bug,当你使用std::thread或std::mutex等时,它们会异常地增加DLL的引用计数
看起来这个bug已经在Visual Studio 2015中修复了。
…我可以确认这个问题没有发生在VS2015. ...
相关文章:
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 将std ::向量转换为阵列和当时的p/调用它会导致访问违规例外,在编组期间mscorlib.dll
- 将 std::string 传递给 C++ DLL 以便与 C# dll 一起使用
- std::set_terminate for DLL?
- 将 std::cout 从单独线程中的 DLL 重定向到 QTextEdit
- 如何在Go中从DLL的导出函数中获取std::字符串
- 如何安全地删除ATL DLL中的std ::线程
- 由 Boost 单元测试框架 dll 导出的 std::basic_ostringstream 会导致"already defined symbol"错误
- C 通过引用DLL中的功能传递std ::字符串
- C++ DLL 返回指向 std::list<std::wstring 的指针>
- std::lock_guard是否递增dll引用计数器?(LoadCount)
- 从DLL返回std::wstring是否安全
- 如何正确地从dll返回std::list
- 用std::vector从dll调用其他dll的C++
- 在DLL边界上使用std::move是一种好的做法吗
- 在 dll 边界上公开 std::vector语言 - 编译器独立性的最佳实践