我正在使用 msvc110 将我的项目迁移到 c++11 标准,不幸的是,在 dll 上使用的线程变量的行为与我所拥有的 boost 版本不同。
所以,最初这是在 msvc90 上工作的,基本上 Dll 调用了一个创建线程的 InitDll。该线程基本上与 dll 的主线程一起充当侦听器。现在,当我创建线程时,它挂起并且什么也不做,甚至不执行用于初始化线程的函数。
您能帮我解释一下如何获得与 boost 版本相同的行为吗?
编辑:代码
抱歉,无法回复评论中的代码
应用程序通过 dll 使用记录器。要在一个非常简单的控制台应用程序中使用记录器,如下所示
#include <Somewhere/Logger.h>
int main()
{
COOL_LOGGER("Here we go logging on console!");
return 0;
}
我们可以讨论代码的编写方式(取自我提到的演示),但是如何初始化 dll 和线程是:
#include "Logger.h"
#ifdef _WIN32
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
TheLog::InitLog();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif
#include <thread>
void InitLog()
{
// Do the init taken from library demos
std::thread m_thread(LogListener);
}
void LogListener()
{
while(!bAppEnd)
{
std::cin>>str;
// change log behavior according to the user input
}
}
// to stop the thread when shutting down
void EndLog()
{
// retrieve thread thought id or some other way
thread.join();
}