返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++Futures与Promises线程使用示例讲解
  • 620
分享到

C++Futures与Promises线程使用示例讲解

C++Futures与PromisesC++PromisesC++Futures 2022-11-21 22:11:52 620人浏览 安东尼
摘要

目录一、说明二、示例一、说明 Futures 和 Promises 是将数据从一个线程传递到另一个线程的工具。虽然这也可以通过其他功能来完成,例如全局变量、futures 和 pro

一、说明

Futures 和 Promises 是将数据从一个线程传递到另一个线程的工具。虽然这也可以通过其他功能来完成,例如全局变量、futures 和 promises 在没有它们的情况下也能工作。此外,您不需要自己处理同步。

未来是一个从另一个线程接收值的变量。如果您访问未来以获取值,您可能需要等到其他线程提供该值。 Boost.Thread 提供 boost::future 来定义未来。该类定义了一个成员函数 get() 来获取值。 get() 是一个阻塞函数,可能需要等待另一个线程。

要在未来设置一个值,您需要使用一个承诺,因为 boost::future 不提供成员函数来设置一个值。

二、示例

Boost.Thread 提供类 boost::promise,它有一个成员函数 set_value()。您总是将 future 和 promise 成对使用。您可以使用 get_future() 从承诺中获得未来。您可以在不同的线程中使用未来和承诺。如果在一个线程中的 promise 中设置了一个值,则可以在另一个线程中从 future 中获取它。

示例 44.14。使用 boost::future 和 boost::promise

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <functional>
#include <iOStream>
void accumulate(boost::promise<int> &p)
{
  int sum = 0;
  for (int i = 0; i < 5; ++i)
    sum += i;
  p.set_value(sum);
}
int main()
{
  boost::promise<int> p;
  boost::future<int> f = p.get_future();
  boost::thread t{accumulate, std::ref(p)};
  std::cout << f.get() << '\n';
}

Example44.14

示例使用未来和承诺。未来 f 是从承诺 p 中接收到的。然后将对 promise 的引用传递给执行 accumulate() 函数的线程 t。 accumulate() 计算 0 到 5 之间所有数字的总和并将其保存在 promise 中。在 main() get() 中调用 future 将总数写入标准输出。

未来 f 和承诺 p 是相关联的。当对未来调用 get() 时,将返回使用 set_value() 存储在承诺中的值。因为该示例使用两个线程,所以可能会在 accumulate() 调用 set_value() 之前在 main() 中调用 get()。在这种情况下,get() 会阻塞,直到使用 set_value() 将一个值存储在 promise 中。

示例 44.14 显示 10。

accumulate() 必须调整为在线程中执行。它必须采用 boost::promise 类型的参数并将结果存储在其中。示例 44.15 引入了 boost::packaged_task,这是一个将值从任何函数转发到未来的类,只要该函数通过 return 返回结果即可。

示例 44.15。使用 boost::packaged_task

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <utility>
#include <iostream>
int accumulate()
{
  int sum = 0;
  for (int i = 0; i < 5; ++i)
    sum += i;
  return sum;
}
int main()
{
  boost::packaged_task<int> task{accumulate};
  boost::future<int> f = task.get_future();
  boost::thread t{std::move(task)};
  std::cout << f.get() << '\n';
}

Example44.15

示例 44.15 与前一个类似,但这次没有使用 boost::promise。相反,此示例使用类 boost::packaged_task,它与 boost::promise 一样提供返回未来的成员函数 get_future()。

boost::packaged_task 的构造函数期望将在线程中执行的函数作为参数,但 boost::packaged_task 本身并不启动线程。必须将类型为 boost::packaged_task 的对象传递给 boost::thread 的构造函数,以便在新线程中执行该函数。

boost::packaged_task 的优点是它在未来存储函数的返回值。你不需要调整一个函数来在未来存储它的值。 boost::packaged_task 可以看作是一个适配器,它可以存储未来任何函数的返回值。

虽然该示例摆脱了 boost::promise,但以下示例也没有使用 boost::packaged_task 和 boost::thread。

示例 44.16。使用 boost::async()

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <iostream>
int accumulate()
{
  int sum = 0;
  for (int i = 0; i < 5; ++i)
    sum += i;
  return sum;
}
int main()
{
  boost::future<int> f = boost::async(accumulate);
  std::cout << f.get() << '\n';
}

在示例 44.16 中,accumulate() 被传递给函数 boost::async()。这个函数统一了 boost::packaged_task 和 boost::thread。它在新线程中启动 accumulate() 并返回未来。

可以将启动策略传递给 boost::async()。这个附加参数决定了 boost::async() 是在新线程中还是在当前线程中执行该函数。如果您传递 boost::launch::async,boost::async() 将启动一个新线程;这是默认行为。如果您传递 boost::launch::deferred,该函数将在调用 get() 时在当前线程中执行。

尽管 Boost 1.56.0 允许将 boost::launch::async 或 boost::launch::deferred 传递给 boost::async(),但尚未实现在当前线程中执行函数。如果您传递 boost::launch::deferred,程序将终止。

到此这篇关于c++ Futures与Promises线程使用示例讲解的文章就介绍到这了,更多相关C++ Futures与Promises内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++Futures与Promises线程使用示例讲解

本文链接: https://lsjlt.com/news/173279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++Futures与Promises线程使用示例讲解
    目录一、说明二、示例一、说明 Futures 和 Promises 是将数据从一个线程传递到另一个线程的工具。虽然这也可以通过其他功能来完成,例如全局变量、futures 和 pro...
    99+
    2022-11-21
    C++ Futures与Promises C++ Promises C++ Futures
  • C++ Futures与Promises线程如何使用
    本篇内容主要讲解“C++ Futures与Promises线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ Futures与Promises线程如何使用”吧!...
    99+
    2023-07-04
  • pythonmultiply()与dot使用示例讲解
    首先创建如下的数组和矩阵,其中a,b为数组,A,B为矩阵 import numpy as np a = np.arange(1,5).reshape(2,2) type(a) Out...
    99+
    2022-12-26
    python multiply() python dot
  • C#多线程Thread使用示例详解
    本文实例为大家分享了C#多线程Thread使用的示例代码,供大家参考,具体内容如下 多线程: 线程生命周期状态图: C#线程优先级(概率高低): 基本使用示例: usin...
    99+
    2024-04-02
  • C++前缀和与差分的使用示例讲解
    目录1.一维前缀和2.二维前缀和3.一维差分4.二维差分前缀和差分是一对逆运算 1.一维前缀和 有一个长度为n的数组an:a1,a2…an; 对于前缀和:Si= a1+...
    99+
    2023-03-09
    C++前缀和与差分 C++前缀和 C++差分
  • C++ 超详细示例讲解list的使用
    目录一、list的介绍list的介绍二、list的使用2.1 list的构造函数2.2 list迭代器的使用2.3 list相关的容量大小相关的函数2.4 list数据的访问相关的函...
    99+
    2024-04-02
  • 通过Java讲解ThreadPool线程池的示例
    这篇文章主要为大家展示了通过Java讲解ThreadPool线程池的示例,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“通过Java讲解ThreadPool线程池的示例”这篇文章吧。Java的特点有...
    99+
    2023-06-06
  • c#使用多线程的几种方式示例详解
    C#中使用多线程的几种方式有以下几种:1. 使用Thread类:Thread类是C#中最基本的多线程类,可以使用它创建和控制线程。下面是一个使用Thread类创建并启动线程的示例:```csharpusing System;using ...
    99+
    2023-08-09
    C#
  • Spring与JDK线程池的简单使用示例详解
    1.配置自定义共享线程池(Spring线程池) @Configuration @EnableAsync public class ThreadPoolConfig{ //主要...
    99+
    2024-04-02
  • C语言示例代码讲解栈与队列
    目录栈栈的定义顺序栈顺序栈的定义顺序栈的初始化顺序栈的入栈顺序栈的出栈取顺序栈的栈顶元素链栈队列队列的定义队列的顺序表达与实现队列顺序存储结构假溢出循环队列循环队列的初始化循环队列的...
    99+
    2024-04-02
  • C++特殊类设计概念与示例讲解
    目录一、设计模式概念二、设计一个不能被拷贝的类三、设计一个只能在堆上创建对象的类3.1 私有构造3.2 私有析构四、设计一个只能在栈上创建对象的类五、设计不能被继承的类六、单例模式6...
    99+
    2023-05-17
    C++特殊类设计 C++设计模式
  • 举例讲解Python编程中对线程锁的使用
    锁 python的内置数据结构比如列表和字典等是线程安全的,但是简单数据类型比如整数和浮点数则不是线程安全的,要这些简单数据类型的通过操作,就需要使用锁。 #!/usr/bin/env python3 ...
    99+
    2022-06-04
    线程 中对 Python
  • Python中的getter与setter及deleter使用示例讲解
    目录原始代码使用getter和setter的代码getter和setter的实战用法如何添加getter和setter官方给出的规范代码示例假如我们需要写一个矩形的类,对象属性包括矩...
    99+
    2023-01-12
    Python getter Python setter Python deleter
  • JS中URL.createObjectURL使用示例讲解
    目录前言URL.createObjectURL()语法参数返回值示例URL.revokeObjectURL()语法参数objectURLReturnvalue示例与FileReade...
    99+
    2024-04-02
  • C++实例讲解引用的使用
    目录1.什么是引用2.引用的用法2.1 普通引用2.2 const 引用2.3 作用在函数参数2.4 作用在函数返回值3.引用的本质1.什么是引用 引用可以看作是一个已经定义的变量的...
    99+
    2024-04-02
  • FactoryBeanBeanFactory方法使用示例详解讲解
    目录一、FactoryBean:用来自定义Bean的创建逻辑实现SqlSessionFactoryBean:二、BeanFactory:负责生产和管理bean的一个工厂类顶层接口三、...
    99+
    2022-12-29
    FactoryBean BeanFactory方法 FactoryBean BeanFactory
  • Golang Makefile示例深入讲解使用
    目录从入门示例开始makefile语法详解再来一个完整示例总结Makefile提供有效方式实现自动化构建任务,与Java中的Maven类似。Makefile主要应用场景为使用目标(标...
    99+
    2023-01-12
    Go Makefile Go Makefile示例
  • C++ 线段树原理与实现示例详解
    目录一、问题引入二、线段树的构建三、线段树的单点修改与查询1、修改2、查询四、线段树的区间修改与查询1、修改2、查询一、问题引入 对于一般的区间问题,比如RMQ(区间的最值)、区间的...
    99+
    2024-04-02
  • C++示例讲解friendstaticconst关键字的用法
    目录一、友元函数1.1重载operator<<1.2友元函数1.3友元类二、关键字const2.1const修饰类的成员函数三、关键字static3.1static类成员...
    99+
    2024-04-02
  • C语言编程C++柔性数组结构示例讲解
    目录绕指柔—柔性数组柔性数组的特点:第一个好处是:方便内存释放第二个好处是:这样有利于访问速度总结绕指柔—柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作