std :: unique_lock <std :: mutex>禁止dll卸载</std :: mutex>

时间:2014-05-16 19:29:23

标签: 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会创建一个帖子?

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

编辑:

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

2 个答案:

答案 0 :(得分:6)

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

请参阅this错误报告。

答案 1 :(得分:3)

看起来这个错误已在Visual Studio 2015中修复。 有关详细信息,请参阅this

  

......我可以确认VS2015没有出现此问题。 ...