我在卸载 dll 时遇到问题。就像this一但退出不同。我正在使用 LoadLibraryA 加载一个 dll然后调用一个函数并用 FreeLibrary 关闭 dll .但是,dll 并没有卸载,但 FreeLibrary 返回成功。 减少代码:
void foo() {
std::unique_lock<std::mutex> lock(mtx_);
}
在调试代码和查看 Process Explorer 时unique_lock 创建第二个线程,但是为什么呢?此外,只要应用程序运行,该线程就会运行。没有别的了; dll 没有其他句柄,没有其他功能。此外,dll 仍在程序中加载。如果我删除上面的行,一切都很好。 dll 卸载正常,没有额外的线程。所以我的问题是,如何避免这种行为以及为什么 unique_lock 创建线程?
互斥量是为多线程设计的,但在测试时,只有一个线程,加载调用foo的dll,并卸载dll。
编辑:
我不知道这是否是 visual studio 实现中的 mutex/unique_lock 的错误,但我通过使用 boost 的 mutex/unique_lock 解决了这个问题。
最佳答案
这是 Visual Studio 中的一个错误,当您使用 std::thread 或 std::mutex 等时,它们会异常增加 DLL 的引用计数。
参见 this错误报告。
关于c++ - std::unique_lock<std::mutex> 禁止dll卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23703197/