gpt4 book ai didi

c++ - 如果线程是从 dll 创建的,std::async 是否会阻止进程退出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:25 25 4
gpt4 key购买 nike

场景:

我有一个控制台应用程序 (consoleApp),我在其中使用来自另一个 dll 的导出函数 (exported_func)。在那个函数中,我启动了一个新的无限线程。这是代码-

EXPERIMENTAL_API int exported_func(void)
{
auto f = []() {
while (true)
{
cout << "H";
this_thread::sleep_for(100ms);
}
return 1;
};

async_res.value = async(launch::async, f);
return 1;
}

现在,我从 main() 函数调用了这个函数,然后我在 main 函数中开始了一个无限循环。这是代码-

int main()
{
exported_func();

while (true)
{
cout << "L";
this_thread::sleep_for(100ms);
}

return 0;
}

问题:

问题是,如果我想通过单击控制台的关闭按钮来关闭我的控制台应用程序,则需要 10 秒才能关闭该应用程序。

此外,如果我使用 CreateChildProcess 创建一个进程(用于 consoleApp.exe),则无法使用 ExitProcess 终止该进程。

但是如果我从主函数(从 consoleApp)创建线程(异步),那么它会立即关闭并可以使用 ExitProcess 终止。

谁能解释一下这里发生了什么?

注意:我使用的是 Visual Studio 17,因此使用的是 visual c++ v141 构建工具。

最佳答案

单击关闭按钮和调用 ExitProcess 都会导致...调用 ExitProcess

ExitProcess 所做的部分工作是使用 DLL_PROCESS_DETACH 为每个加载的 DLL 调用 DLL 入口点函数。

VC++ 运行时的 DLL 入口点 (_DllMainCRTStartup) 在收到 DLL_PROCESS_DETACH 时所做的部分工作是为 DLL 的全局变量调用析构函数。

std::async 返回的 std::future 的析构函数阻塞,直到共享状态准备就绪 - 它永远不会这样做,因为 1) 你的函数没有't return 和 2) ExitProcess 强行终止运行该函数的线程。

EXE 中的全局对象 are handled differently , 并且,至少对于更新版本的运行时库,在调用 ExitProcess 时不会调用它们的析构函数。

关于c++ - 如果线程是从 dll 创建的,std::async 是否会阻止进程退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45912862/

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