c++ - std::unique_lock<std::mutex> 禁止dll卸载

标签 c++ windows dll

我在卸载 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/

相关文章:

c++ - 编译时出现信号/槽错误

java - Windows 10 和 ubuntu 是否可以使用相同的 JDK?

c# - 使用 C# 测试 C++ 代码时的代码覆盖率

c++ - 在 DLL 中运行后,变量一直设置为 NULL

C# StringWriter 比 C++ ofstream 更快(通过 pinvoke)?

c++编码选择开关代码上的每个案例

c++ - 如何有效地存储等价物(来自连接组件标记算法)?

c++ - 如何隐藏数独表中的数字?

python - Tensorflow 使用 python 在 Windows 中将 .pb 文件转换为 .lite 文件

c++ - Qt 在 Linux 上不显示 PNG 图像