首页 > 编程语言 >c++多线程 std::async std::future

c++多线程 std::async std::future

时间:2023-06-15 20:44:51浏览次数:61  
标签:std launch future 线程 async 多线程 wait

c++标准库中对线程操作有完善的封装,其中最常用到的如std::thread, std::async。

EffectiveModernCpp中指出,应尽量使用std::async即基于任务的编程而非基于线程的编程。std::thread在前面的文章有提到过,此处仅对std::async作以记录。

正如前面所说,std::async是基于任务的策略,本人理解为对线程操作的更抽象的封装。对比std::thread,其更灵活且可以异步访问结果。

将闭包传递给std::async后,其会返回一个std::future期物,可对期物使用wait()方法等待线程结束,get()方法得到线程返回值。

std::future有三种状态:

std::future_status::ready  //线程执行完

std::future_status::timeout  //线程超时

std::future_status::deferred  //线程延迟执行(还未开始执行)

对std::future对象可使用wait_for(std::chrono::milliseconds)方法得到线程当前的状态

auto fut = std::async(doAsyncWork);
...    //主线程的一些操作
fut.wait();    // 在此设置屏障,阻塞到期物的完成
auto res = fut.get();    //得到结果

值得注意的是,系统可以支持的线程数量是有限的,因此若开发者试图创建大于系统支持的线程数量,会抛出std::system_error异常。

即使没有超出软件线程的限额,仍然可能会遇到资源超额(oversubscription)的麻烦。这是一种当前准备运行的(即未阻塞的)软件线程大于硬件线程的数量的情况。

而std::async有两种启动策略:

  • std::launch::async启动策略意味着f必须异步执行,即在不同的线程。
  • std::launch::deferred启动策略意味着f仅当在std::async返回的future上调用get或者wait时才执行。这表示f推迟到存在这样的调用时才执行

而std::async默认的启动策略是二者的求或,即std::launch::async | std::launch::deferred,因此默认策略允许异步或者同步执行。这种灵活性允许std::async和标准库的线程管理组件承担线程创建和销毁的责任,避免资源超额,以及平衡负载。这就是使用std::async并发编程如此方便的原因。

需注意,若使用默认启动策略,使用者便无法得知线程的状态,即无法预测线程是否是同步或异步,是否在等待还是执行。

 

 

 

本文参考EffectiveModernCpp,多为个人思考,仅供参考。

 

标签:std,launch,future,线程,async,多线程,wait
From: https://www.cnblogs.com/Explosion556/p/17484071.html

相关文章

  • Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】)
    在上一节中,我们已经了解了Java多线程编程中常用的关键字synchronized,以及与之相关的对象锁机制。这一节中,让我们一起来认识JDK5中新引入的并发框架中的锁机制。我想很多购买了《Java程序员面试宝典》之类图书的朋友一定对下面这个面试题感到非常熟悉:问:请对比synchronized......
  • [问题解决]:ImportError: /home/test/anaconda3/envs/py39/bin/../lib/libstdc++.so.6
    报错(py39)test@test:~/code/Face/test_speed$pythonface_yaw_pitc_roll.pyTraceback(mostrecentcalllast):File"/home/test/code/Face/test_speed/face_yaw_pitc_roll.py",line17,in<module>importdlibFile"/home/test/anacon......
  • mormot2 THttpAsyncServer
    mormot2THttpAsyncServer支持delphi和lazarus。///<author>cxg2023-2-12</author>///mormot2异步httpserver支持delphi+lazarusunitsock.mormot2.httpserver;{$IFDEFfpc}{$MODEDELPHI}{$H+}{$ENDIF}interfaceusesclasses,keyValue.serialize,......
  • 多线程
    概念程序:一段静态的代码进程:运行中的程序进程作为资源分配的单位线程:进程进一步细化为线程,是一个程序内部的一条执行路径实现方式继承thread创建一个继承Thread的子类子类中重写父类的run()方法创建子类的对象通过子类对象.start()启动线程实现runable接口创建......
  • 异步编程 asynico、async、await最佳实践
    使用异步函数:Asynico是为了处理异步操作而设计的,因此使用异步函数而不是同步函数是最佳实践之一。使用async关键字将函数定义为异步函数,并使用await关键字来等待异步操作的结果。示例:importasyncioasyncdefmy_async_function():#异步操作awaitasyncio.sleep(1)......
  • Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)
    在上一篇中,我们讲到了多线程是如何处理共享资源的,以及保证他们对资源进行互斥访问所依赖的重要机制:对象锁。本篇中,我们来看一看传统的同步实现方式以及这背后的原理。很多人都知道,在Java多线程编程中,有一个重要的关键字,synchronized。但是很多人看到这个东西会感到困惑:“都说同......
  • Python教程-多线程与多进程
    什么是线程,什么是进程?进程是程序(软件,应用)的一个执行实例,每个运行中的程序,可以同时创建多个进程,但至少要有一个。每个进程都提供执行程序所需的所有资源,都有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变......
  • Linux C 编程——多线程
    线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。与多进程相比,多进程具有多进程不具备的一些优点,其最重要的是:对于多线程来说,其能够比多进程更加节省资源。1、线程创建在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原......
  • axios-结合async和await调用axios
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><buttonid="btnPost">发起POST请求</button><scriptsrc="lib/axios.js">&......
  • v831-openwrt-c-多线程、队列篇
    前言这几天都在搞多线程和队列,但是最后发现由于v831的单核,用了多线程和队列还不如不用,并且吐槽一下c的线程和队列库,特别队列库很难用。线程库#include<pthread.h>      //系统的多线程文件使用条例:使用的很简单,网上的说明很清楚,不需要详细说明指向感悟很鸡肋......