当前位置:   article > 正文

C++标准库笔记-多线程-细说async()_c++ async是多线程

c++ async是多线程

async()

在前文C++11笔记-多线程-初识-async()和Future中,初次使用async()和Future来实现一个多线程的demo;
本文是在学习《C++标准库》时,做的笔记;
在上一文中讲到,async()是尝试启动被调用的函数;用《C++标准库》的话来说,async()是个辅助函数,用来在分离线程中启动某个函数(如果可能的话,例如单线程系统就不可能);所以如果底层平台支持多线程,你可以让函数并发运转;如果底层平台不支持,也没有任何损失,就是从并行编程模型退化到串行编程模型,从异步执行退化到同步执行;

async()函数接口

future async(std::launch::async, F func, args…)

  • 尝试启动func并给予实参args,形成一个异步任务(asynchronous task;一个并行线程);
  • 如果以上办不到,就抛出std::system_error异常,带着差错码std::errc::resource_unavailable_try_again;
  • 被启动的线程保证在程序结束前完成,除非程序中途失败(abort);
  • 以下情况会结束线程(完成工作):
    1.对返回的future调用get()或wait();
    2.如果最后一个指向“返回之future所代表的shared state”的object被销毁
  • 这意味着对async()的调用会造成停滞(block)直到func完成----如果async()的返回值未被使用的话;
    future async(std::launch::deferred,F func, args…)
  • 传递func并夹带实参args,形成一个推迟任务(deferred task)。当我们对返回的future调用wait()或get(),那个推迟任务即被同步调用(synchronously called);
  • 如果未曾如上调用wait()和get(),那个推迟任务(deferred task)绝不会启动;
    future async(F func, args…)
  • 相当于调用async()并携带“std::launch::async”和“std::launch::deferred组合而成”的launch(发射)策略。系统会根据当前形势选择其中一个发射策略。就是说,如果立即发射策略没有奏效的话,会造成func函数被推迟执行;即一般的async使用方式;不管是选择哪种策略,我们只要调用了wait()或者get(),func就一定会被调用并且完成;
  • 如果没有对返回的future调用wait()或get(),func有可能永不被调用;
  • 注意:如果无法异步调用func,本形式的async()不会抛出system_error异常(但也可能因为其他原因而抛出system_error);
    注意:所有的async()接口都只要求func是个callable object(function/memeber function/function object/lambda);

示例

立即发射

使用get()方法获取结果:

	cout << "starting func1() in background" << " and func2() in foreground:" << endl;
	future<int> result1(async(std::launch::async, func1));
    int result2 = func2();
    int result = result1.get() + result2;
    cout << "\n result of func1()+func2(): " << result << endl;
  • 1
  • 2
  • 3
  • 4
  • 5

执行结果:
在这里插入图片描述
当future对象被销毁:

	{future<int> result1(async(std::launch::async, func1)); }
	int result2 = func2();
  • 1
  • 2

由于result1对象销毁时,需要阻塞程序,直到func1函数执行完毕后;
执行结果:
在这里插入图片描述

推迟执行

将async设置为推迟执行模式;

	cout << "starting func1() in background" << " and func2() in foreground:" << endl;
	future<int> result1(async(std::launch::deferred, func1));
    int result2 = func2();
    int result = result1.get() + result2;
    cout << "\n result of func1()+func2(): " << result << endl;
  • 1
  • 2
  • 3
  • 4
  • 5

可以发现在func2执行完毕后,直到调用了result.get()函数后,func1的内容才打印在窗口上;
执行结果:
在这里插入图片描述

总结

async()作为多线程编程的高级接口,接口简单易用,能够让新手快速入门多线程编程;
需要注意的是立即发射模式、推迟执行模式以及默认的混合模式,三个不同模式时对future的操作以及错误异常信息;

文献

1.《C++标准库》第二版;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/602481
推荐阅读
相关标签
  

闽ICP备14008679号