C++ 如果线程是从dll创建的,异步会阻止进程退出吗?

C++ 如果线程是从dll创建的,异步会阻止进程退出吗?,c++,multithreading,c++11,C++,Multithreading,C++11,场景: 我有一个控制台应用程序(consoleApp),其中我使用从另一个dll导出的函数(exported_func)。在该函数中,我启动了一个新的无限线程。这是代码- EXPERIMENTAL_API int exported_func(void) { auto f = []() { while (true) { cout << "H"; this_thread::sleep_for(100m

场景:

我有一个控制台应用程序(
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;
}
int main()
{
    exported_func();

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

    return 0;
}
问题:

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

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

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

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


<强>注:我使用VisualStudio 17,因此VisualC++ V141构建工具.< /P>

同时单击关闭按钮并调用<代码> ExtPosie<代码>导致…调用

ExitProcess

ExitProcess
的一部分功能是使用
DLL\u PROCESS\u DETACH
为每个加载的DLL调用DLL入口点函数

VC++运行时的DLL入口点(
\u DllMainCRTStartup
)在接收到
DLL\u PROCESS\u DETACH
调用DLL全局变量的析构函数时所做的部分工作

std::async
返回的
std::future
的析构函数将阻塞,直到共享状态变为就绪状态—它从来不会这样做,因为1)您的函数不返回,2)
ExitProcess
强制终止运行该函数的线程


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

什么是
async\u res.value
async\u res
是一个结构,而
future value
是它的一个成员。全局变量?是的,对。这是一个全局变量。在“从主函数创建线程”案例中,您将未来存储在哪里?谢谢!这就解释了其中的大部分。但我不太清楚,如果我使用控制台的关闭按钮关闭,为什么它会在10秒钟后退出。它应该挂起,对吗?@RasheduzzamanSourov关闭按钮会导致操作系统向您的程序发送一个
CTRL\u close\u事件
;调用
ExitProcess
的默认处理程序。处理器允许运行的时间有一个时间限制;如果处理程序超时,Windows只是强制终止进程。