std::unique_lock<std::mutex> 禁止 DLL 卸载

std::unique_lock<std::mutex> prohibit dll unloading

本文关键字:std DLL 卸载 gt 禁止 lt unique lock mutex      更新时间:2023-10-16

我有一个问题,而卸载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. ...