gpt4 book ai didi

C++11线程与boost线程

转载 作者:行者123 更新时间:2023-11-30 01:23:27 26 4
gpt4 key购买 nike

我正在使用 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;
}

我们可以讨论代码的编写方式(取 self 提到的演示),但是 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();
}

最佳答案

如果 DllMain 出现问题,那么您可以做的事情将受到严重限制 --- Windows 加载程序通常只会终止应用程序,并且通常不会调用错误处理程序。

挂起表明代码正在做一些需要加载 DLL 的事情,或者正在等待另一个 DLL 初始化,这两种情况都不会发生,直到为此 DLL 调用 DllMain 完成。 std::thread 的实现可能正在做这些事情之一。

编辑:避免此问题的一种方法是在每个与此后台线程通信的导出函数中使用 std::call_once,以确保线程已启动。这样您就不会在 DllMain 中使用 std::thread,但您不需要公开“init”函数。

关于C++11线程与boost线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14942349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com