当前位置: 首页 > article >正文

C++并行处理支持库 之六

C++并行处理支持库 之六

  • std::promise
    • 构造器
    • APIs
    • 应用实例

通过使用Futures标准库,我们可以获取异步任务返回值,捕获异步任务引发的异常。异步任务就是在独立线程中启动运行的函数。

这些值以共享状态进行通信,其中异步任务可以写入其返回值,或存储异常,并且可以其他线程检查、等待或以其他方式操作,这些线程包含std::future或std::shared_future实例,而std::future或std::shared_future引用该共享状态。

std::promise

template< class R > class promise;
template< class R > class promise<R&>;
template<> class promise;

构造器

构造器意义
promise()默认构造函数。使用空的共享状态构造 Promise
template< class Alloc > promise( std::allocator_arg_t, const Alloc& alloc )使用空的共享状态构造 Promise。共享状态是使用alloc分配的。 Alloc必须满足Allocator的要求
promise( promise&& other ) noexcept移动构造函数。使用移动语义与other的共享状态构建 Promise。构建后,other没有共享状态。
promise( const promise& other ) = deletePromise不可复制

APIs

API说明
get_future返回与promise结果相关的future
set_value将结果设置为特定值
set_value_at_thread_exit将结果设置为特定值,同时仅在线程退出时,传递通知
set_exception设置结果,以指示异常
set_exception_at_thread_exit设置结果,以指示异常,同时仅在线程退出时,传递通知

应用实例

下面展示一些 内联代码片

#include  <iostream>
#include  <thread>
#include  <vector>
#include  <future>
#include  <numeric>

using namespace std;

void acc_f(vector<int> &num_v,
                promise<int> accumulate_promise)
{
    int sum = accumulate(num_v.begin(), num_v.end(), 0);
    accumulate_promise.set_value(sum); // Notify future
}
 
void do_work(promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
	cout << "do_work done !!!" << endl;

    barrier.set_value();  // Notify future
}
 
int main()
{
    // promise<int> to transmit a result between threads.
    vector<int> numbers = {1, 12, 3, 4, 15, 61};
    promise<int> accumulate_promise;
    future<int> accumulate_future = accumulate_promise.get_future();

    thread work_thread(acc_f, ref(numbers), move(accumulate_promise));
 
    cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // wait for thread completion
 
    // promise<void> to signal state between threads.
    promise<void> barrier;
    future<void> barrier_future = barrier.get_future();
    thread t2(do_work, move(barrier));
    barrier_future.wait();
    t2.join();
}
result=96
do_work done !!!

http://www.kler.cn/a/463507.html

相关文章:

  • 大模型系列17-RAGFlow搭建本地知识库
  • QQ长截屏
  • 高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程
  • Python 链接 Pcomm
  • 多文件比对
  • C#中自定义集合的序列化与反序列化实现
  • Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(3):配置备用数据库
  • 慧集通iPaaS集成平台低代码培训-基础篇
  • WebApi使用 (.Net Framework版)
  • 【AIGC】COT思维链:让AI学会拆解问题,像人一样思考
  • 【golang】go errors 处理错误追踪打印堆栈信息
  • idea 开发Gradle 项目
  • Linux:基础IO
  • HTML入门教程|| HTML 基本标签(2)
  • 第 28 章 - ES 源码篇 - Elasticsearch 启动与插件加载机制解析
  • 【每日学点鸿蒙知识】输入框光标显示问题、web组件回调async问题、图片加载流程监控、背景图片大小不生效问题、alert无效
  • 像素的访问和算术运算
  • 【R语言】校准曲线,绘制原理
  • 游戏关卡设计方法的杂感
  • 【Unity3d】C#浮点数丢失精度问题
  • 如何查询快手IP归属地?如何关闭
  • HTML——46.制作课程表
  • 鸿蒙应用开发 - 如何去掉字符串中空格
  • 使用 `Celery` 与 `RabbitMQ` 实现异步任务队列:构建高效、可靠的任务调度系统
  • 深度学习在光学成像中是如何发挥作用的?
  • [创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较