一 std::async()的四种参数使用情况
A std::launch::deferred 延迟异步任务调用,并不创建新线程。等future对象调用get()或者wait()时才去执行线程入口函数,如果没调用,则不执行。
B std::launch::async 强制这个异步任务在新线程上执行。这意味着系统必须创建出新线程来执行线程入口函数。
C std::launch::deferred | std::launch::async 让系统来决定A或者B行为。
D 不带额外参数 等同于情况C。系统会自行决定是异步(创建新线程)还是同步方式(不创建线程)运行。如果系统资源紧张,则不会创建新线程,采取A方式。如果能创建新线程,则使用B情况。
二 std::async()与std::thread的区别
- std::thread创建线程,如果系统资源紧张,会创建线程失败,那么整个程序会报异常奔溃。
- std::async()更方便取得结果,并且可能不会创建新线程。
三 std::async不确定性问题解决
通过下面这种方法来判断:
std::future_status status = result.wait_for(0s);
if (status == std::future_status::timeout)
{
// 表示线程还没有执行完
cout << "time out" << endl;
}
else if (status == std::future_status::ready) // 执行完毕
{
// 表示成功返回
cout << "mythread execute finished" << endl;
cout << result.get() << endl;
}
else if (status == std::future_status::deferred) // 延迟执行
{
// 如果async的第一个参数被设置为std::launch::deferred,则本条件成立
// 根本没有创建子线程
// 此时result.wait_for()不会卡住主流程,直接跳到这里。
cout << "deferred " << endl;
cout << result.get() << endl;
}