主线程等待 std::async 完成

aro*_*ola 6 c++ multithreading asynchronous stdasync

我正在使用std::async创建一个线程,我希望这个新线程应该单独执行并且主线程不应该等待它。但是在这里,当我调用 std::async 时,会创建一个新线程,但主线程正在等待fun(). 我希望主线程在不等待fun()完成的情况下并行执行。我该怎么做?

#include <iostream>
#include <windows.h>
#include <future>
using namespace std;



void printid()
{
   cout << "Thread id is:" << this_thread::get_id() << endl;
}

void fun(void *obj)
{

   cout<<"Entry"<<endl;
   printid();
   Sleep(10000);
   cout<<"Exit"<<endl;
}


int main()
{
    cout<<"Hello"<<endl;
    printid();
    std::async(std::launch::async, fun, nullptr);
    cout << "After call" << endl;
}
Run Code Online (Sandbox Code Playgroud)

我得到输出:

Hello
Thread id is:22832
Entry
Thread id is:13156
Exit
After call
Run Code Online (Sandbox Code Playgroud)

LWi*_*sey 6

一个std::future被返回的对象std::async,并推出了std::launch::async政策,对破坏块,直到推出已经完成了任务。

既然你不返回存储std::future在一个变量,它在声明中与最终被破坏std::async,因此,main无法继续,直到任务完成。

如果您存储该std::future对象,它的生命周期将延长到结束,main您将获得所需的行为。

int main()
{
    ...
    auto fut = std::async(std::launch::async, fun, nullptr);
    ...
}
Run Code Online (Sandbox Code Playgroud)


use*_*301 3

std::async(std::launch::async, fun, nullptr);
Run Code Online (Sandbox Code Playgroud)

不对返回的内容做任何事情std::future,让它被销毁。这是一个问题,因为std::future的析构函数可能会阻塞并等待线程完成。

解决方案是保留std::future一段时间,并在完成其他所有操作后将其销毁。

auto locallyScopedVariable = std::async(std::launch::async, fun, nullptr);
Run Code Online (Sandbox Code Playgroud)

locallyScopedVariable将在结束时超出范围main,然后阻塞直到完成。

请注意,这可能仍然无法达到您想要的效果。主线程可以立即将处理器交给新线程,并允许新线程在控制权返回之前运行完成。该代码可以被更正,但仍然会导致输出不正确的版本。