首页 > 其他分享 >std::future、std::promise、std::packaged_task、std::async

std::future、std::promise、std::packaged_task、std::async

时间:2023-07-06 22:01:44浏览次数:47  
标签:std task int packaged future promise include

std::promise

std::promise:用于获取线程中变量的结果,如下:

#include <iostream>
#include <thread>
#include <future>

void printMessage(std::promise<std::string>&& prms, std::string message) {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    prms.set_value(message); // 设置promise的值
}

int main() {
    std::promise<std::string> prms; // 创建一个promise对象
    std::future<std::string> ftr = prms.get_future(); // 获取与promise关联的future对象

    std::thread t(printMessage, std::move(prms), "Hello, std::promise!"); // 在新线程中调用printMessage函数

    std::cout << "Waiting for the message..." << std::endl;
    std::string message = ftr.get(); // 等待并获取future的值
    std::cout << "Received message: " << message << std::endl;

    t.join();

    return 0;
}

在线程函数中给外面传进来的promise对象,当线程函数执行完成之后就可以通过promis获取该值了,值得注意的是取值是间接的通过promise内部提供的future来获取的。

std::future

获取future结果有三种方式:get、wait、wait_for,其中get等待异步操作结束并返回结果;wait只是等待异步操作完成,没有返回值;wait_for是等待异步操作完成,然后再等几秒钟再返回结果。

future_status有三种状态:

  • deferred:异步操作还没开始
  • ready:异步操作已经完成
  • timeout:异步操作超时
//查询future的状态
std::future_status status;
do {
    status = future.wait_for(std::chrono::seconds(1));
    if (status == std::future_status::deferred) {
        std::cout << "deferred\n";
    } else if (status == std::future_status::timeout) {
        std::cout << "timeout\n";
    } else if (status == std::future_status::ready) {
        std::cout << "ready!\n";
    }
} while (status != std::future_status::ready);

std::packaged_task

std::packaged_task获取线程函数的返回值,如下:

#include <iostream>
#include <thread>
#include <future>
#include <functional>

int add(int a, int b) {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return a + b;
}

int main() {
    std::packaged_task<int(int, int)> task(add); // 创建一个packaged_task,将add函数作为可调用对象
    std::future<int> future = task.get_future(); // 获取与packaged_task关联的future对象

    std::thread t(std::move(task), 3, 4); // 在新线程中调用packaged_task

    std::cout << "Waiting for the result..." << std::endl;
    int result = future.get(); // 等待并获取future的值
    std::cout << "Result: " << result << std::endl;

    t.join();

    return 0;
}

std::async

std::async:std::async是将线程创建和std::promise封装了在一起(我的理解)

#include <iostream>
#include <future>

int add(int a, int b) {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return a + b;
}

int main() {
    std::future<int> future = std::async(add, 3, 4); // 异步执行add函数,并返回future对象

    std::cout << "Waiting for the result..." << std::endl;
    int result = future.get(); // 等待并获取future的值
    std::cout << "Result: " << result << std::endl;

    return 0;
}

参考:连接1

标签:std,task,int,packaged,future,promise,include
From: https://www.cnblogs.com/codingbigdog/p/17533448.html

相关文章

  • Python中标准输入(stdin)、标准输出(stdout)、标准错误(stdout)的用法
    1.标准输入input()、raw_input()Python3.x中input()函数可以实现提示输入,python2.x中要使用raw_input(),例如:foo=input("Enter:")#python2.x要用raw_input()print("Youinput:[%s]"%(foo))#测试执行Enter:abcdeYouinput:[abcde]#读取一行(不......
  • 性能优化利器 std::move/forward 实现原理
    utility包含了STL经常使用的几个模板函数的定义:std::move()用于得到一个右值引用;std::swap()使用移动语义,交换两个对象;std::forward()支持完美转发。本文分析了上述三个模板函数的实现原理。本文内容:1、std::move2、std::swap3、std::forward 1、std::move......
  • 解决Flutter编译一直显示Running Gradle task 'assembleDebug'
    该问题由Gradle的Maven仓库在国外访问受限引起,使用阿里云的镜像仓库地址替代解决1.修改FlutteSDK目录下的Flutter打包配置文件flutter.gradle一般位于flutter\packages\flutter_tools\gradle\flutter.gradle1buildscript{repositories{//google()......
  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC的单任务task的多CPU运行模
    超算是离我们平时生活比较远的一个事情,即使是对于一个计算机专业方向的学生来说,正好实验室得到了华为的超算平台的使用账号,于是就摸索了一下,不得不承认这个东西确实不是普通人能搞的明白的。 基本概念:一个工作Job可以开多个副本,每个副本都是mpirun-N所开出的,每个副本又被叫......
  • Task Execution and Scheduling In SpringBoot
    开天辟地TaskExecutionandSchedulingIntheabsenceofanExecutorbeaninthecontext,SpringBootauto-configuresaThreadPoolTaskExecutorwithsensibledefaultsthatcanbeautomaticallyassociatedtoasynchronoustaskexecution(@EnableAsync)andSpr......
  • C++面试八股文:std::array如何实现编译器排序?
    C++面试八股文:std::array如何实现编译器排序?某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候......
  • Mac中VscodeC++万能头文件配置bits/stdc++.h
    /Library/Developer/CommandLineTools/usr/include路径下创建bits文件夹新建stdc++.h头文件,内容如下//C++includesusedforprecompiling-*-C++-*-//Copyright(C)2003-2018FreeSoftwareFoundation,Inc.////ThisfileispartoftheGNUISOC++Library.T......
  • 【C#/.NET】探究Task中ConfigureAwait方法
    ​ 目录 引言ConfigureAwait方法的作用和原理ConfigureAwait方法的使用场景非UI线程场景避免上下文切换避免死锁ConfigureAwait方法的注意事项在UI线程使用时需要小心嵌套搭配使用总结 引言        在.NET开发中,我们经常使用异步编程来提高应用程序的......
  • ScheduledThreadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(bo
    MethodSummary voidexecute(Runnable          Executecommandwithzerorequireddelay. booleangetContinueExistingPeriodicTasksAfterShutdownPolicy()          Getthepolicyonwhethertocontinueexecutingexistingperiodictaskseven......
  • 【WALT】WALT入口 update_task_ravg() 代码详解
    目录【WALT】WALT入口update_task_ravg()代码详解代码展示代码逻辑⑴ 判断是否进入WALT算法⑵ 获取WALT算法中上一个窗口的开始时间⑶如果任务刚初始化结束⑷ 更新任务及CPU的cycles⑸ 更新任务及CPU的demand及pred_demand⑹ 更新CPU的busytime⑺ 更新任务的p......