c++ - 无法在 DLL 上锁定 C++ 11 std::mutex

标签 c++ c++11 visual-studio-2013 mutex

<分区>

我试图通过使用 std::lock 对象来防止对 DLL 初始化函数的多次调用。

在独立程序上使用这样的程序时:

#include <mutex>
std::mutex mtx;

void main(){
  mtx.lock();
  (...)
  mtx.unlock()
}

在 DLL 上调用时,这段完全相同的代码无法通过 mtx.lock()

BOOL APIENTRY DllMain(HANDLE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved)
{
    f_Init(VERSION_ID);
    return TRUE;
}

//On another cpp file, a static library actually.
#include <mutex>
std::mutex mutex_state;
void f_Init(DWORD version){
    //Acquire the state lock
    mutex_state.lock(); //<-- Will NOT get past this line
    (...)
    mutex_state.unlock();
}

为什么在这种情况下无法锁定互斥体?

我目前使用的是 Microsoft Visual Studio 2013。

最佳答案

不需要互斥体。对 DllMain 的访问由实现序列化。

Access to the entry point is serialized by the system on a process-wide basis. Threads in DllMain hold the loader lock so no additional DLLs can be dynamically loaded or initialized. -- DllMain Entry Point

当您输入 DllMain 时,您的代码会死锁,因为您已经持有锁。在持有一些未知的锁组合的同时尝试获取额外的锁很可能会死锁。您应该永远不要DllMain 中获取任何额外的锁。

例如,考虑是否需要附加一些额外的 DLL 来锁定互斥锁。不能同时附加两个 DLL,正在附加您的 DLL。第一次锁定互斥量可能需要分配内存,而分配内存可能需要附加 DLL——所以不要在 DllMain 中这样做。

顺便说一下,这些同样令人痛苦的限制适用于全局对象的构造函数和析构函数。

关于c++ - 无法在 DLL 上锁定 C++ 11 std::mutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24601501/

相关文章:

C++ 获取句柄字符串值

C++11 数组初始化不会调用复制构造函数

c++ - 当模板参数无效时如何抛出异常?

asp.net-mvc - 上下文菜单中缺少 ASP MVC 5 项目 'New Scaffolded Item...'

c# - 从 VS2012 升级到 VS2013 后 SGEN 不起作用

c++ - 如何知道进程是否是应用程序 - Windows

c++ - ASCII 到 dec 存储在字符串中

c++ - 使用 gcc 4.4 的模板模板参数和可变参数模板

c++ - 如何使用自定义分配器创建 std::function?

asp.net - 命令 "nuget pack..."以代码 1 退出