锁定<std :: mutex>禁止卸载

卸载dll时遇到问题。 它就像这个一样,但不一样。 我正在使用LoadLibraryA加载DLL,然后调用函数并使用FreeLibrary关闭DLL。 但是,该DLL不卸载,但FreeLibrary返回成功。 简化代码:

void foo() {
    std::unique_lock<std::mutex> lock(mtx_);
}

在调试代码并查看Process Explorer时,unique_lock会创建第二个线程, 但为什么 ? 此线程只要应用程序运行就运行。 除此之外没有别的; 没有其他句柄的DLL,没有其他功能。 此外,该DLL仍然在程序中加载。 如果我删除上面的行,一切都很好。 该DLL是卸载好,没有额外的线程。 所以我的问题是, 如何避免这种行为,为什么是unique_lock创建一个线程?

该互斥体是用于多线程,但在测试时,只有一个线程,加载dll调用foo,并卸载dll。

编辑:

我不知道这是否是互斥锁/ unique_lock的visual studio实现中的错误,但我通过使用boost的互斥锁/ unique_lock解决了问题。


这是Visual Studio中的一个错误,当您使用std :: thread或std :: mutex等时,它们会异常增加DLL的引用计数。

看到这个错误报告。


它看起来像这个错误已经在Visual Studio 2015中修复了。详情请看这里。

...我可以确认VS2015没有发生这个问题。 ...

链接地址: http://www.djcxy.com/p/91031.html

上一篇: lock<std::mutex> prohibit dll unloading

下一篇: How do I ensure Interface instance is freed before FreeLibrary is called