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