- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
场景:
我有一个控制台应用程序 (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/
我是一名优秀的程序员,十分优秀!