C++11 并发与多线程(十一、std::async详细

一、std::async参数详述
作用:创建一个异步任务(可以用来创建线程,但是一般不这么叫)
std::launch::deferred : 延迟调用 std::launch::async : 强制创建一个线程
std::thread() 如果资源紧张,那么可能会创建线程失败,整个程序崩溃
std::async和std::thread最明显的不同,就是async有时候并不创建新线程
std::launch::async: 强制这个异步任务在新线程上执行,系统一定会创建出新线程来运行
二、std::thread 和 std::async的区别
std::thread() 如果资源紧张,那么可能会创建线程失败,整个程序崩溃;如果用async就不会报异常不会崩溃,这种不加额外参数的调用就不会创建新线程,而是后续谁调用了result.get()来请求结果,那么这个异步任务就运行在执行这条get()语句所在 的线程上
std::thread 创建线程的方式,如果线程返回值,想拿到值不容易(但是也可以通过将返回值赋值给全局变量;packed_task; promise等方式)
std::async 创建异步任务,可能创建也可能不创建线程。并且async调用方法很容易拿到线程入口函数的返回值
如果你强制std::async一定要创建新线程,那么就必须使用std::launch::async作为第一个参数,承受的待久就是系统资源紧张是,程序崩溃
老司机提示:创建线程并不是越多越好,一般不建议超过100-200个

三、std::async(不加额外参数std::async(mythread))问题解决
std::async ()不加额外参数,让系统自寻决定是否创建新线程
判断这个异步任务到底有没有被推迟执行 可以通过wait_for()来判断

int mythread()
{
cout << "this thread id = " << this_thread::get_id() << endl; 
return 10;
} 

int main() { 
cout << "main thread id = " << this_thread::get_id() << endl; 
std::future result = std::async(mythread); //想判断async到底有没有创建新线程还是延迟没创建新线程

std::future_status status = result.wait_for(0s);//(std::chrono::seconds(0));    //等待0秒
if (status == std::future_status::deferred)
{
    //线程被延迟执行了
    cout << result.get() << endl;   //这个时候才去调用mythread
}
else if (status == std::future_status::ready)
{
    cout << "线程成功执行并返回" << endl;
    cout << result.get() << endl;

}
else
{
//表示线程还没执行完
    cout << "超时,线程还没有执行完毕" << endl;
}

cout << "程序运行完毕,退出" << endl;
return 0;

}

发表回复

您的电子邮箱地址不会被公开。