【发布时间】:2014-07-07 00:08:23
【问题描述】:
我试图通过使用 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。
【问题讨论】:
-
是的,几乎是同一个问题。此外,如果 D Schwartz(下)是正确的,则不需要 DLLMAIN 上的锁定。
-
作为参考,Microsoft Connect bug report 按设计关闭。
-
你的实际初始化包括什么?很可能是在
DllMain中不应该做的事情。 (请参阅 this article 了解为什么DllMain应该最小。)
标签: c++ c++11 visual-studio-2013 mutex