返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ Futures与Promises线程如何使用
  • 190
分享到

C++ Futures与Promises线程如何使用

2023-07-04 15:07:30 190人浏览 八月长安
摘要

本篇内容主要讲解“c++ Futures与Promises线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ Futures与Promises线程如何使用”吧!

本篇内容主要讲解“c++ Futures与Promises线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ Futures与Promises线程如何使用”吧!

一、说明

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线程如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C++ Futures与Promises线程如何使用

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

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

猜你喜欢
  • C++ Futures与Promises线程如何使用
    本篇内容主要讲解“C++ Futures与Promises线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ Futures与Promises线程如何使用”吧!...
    99+
    2023-07-04
  • C++Futures与Promises线程使用示例讲解
    目录一、说明二、示例一、说明 Futures 和 Promises 是将数据从一个线程传递到另一个线程的工具。虽然这也可以通过其他功能来完成,例如全局变量、futures 和 pro...
    99+
    2022-11-21
    C++ Futures与Promises C++ Promises C++ Futures
  • C#多线程编程Task如何使用
    这篇“C#多线程编程Task如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#多线程编程Task如何使用”文章吧。一...
    99+
    2023-06-29
  • C++ 如何实现多线程与线程同步
    目录CreateThread 实现多线程:beginthreadex 实现多线程:CreateMutex 互斥锁实现线程同步:通过临界区实现线程同步:Semaphore 基于信号实现...
    99+
    2024-04-02
  • Java中用户线程与守护线程如何使用
    本篇内容介绍了“Java中用户线程与守护线程如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.默认用户线程Java 语言中无论是线程...
    99+
    2023-06-30
  • C#如何使用多线程中的lock
    小编给大家分享一下C#如何使用多线程中的lock,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于...
    99+
    2023-06-17
  • C#线程委托BeginInvoke与EndInvoke怎么使用
    这篇文章主要讲解了“C#线程委托BeginInvoke与EndInvoke怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程委托BeginInvoke与EndInvoke怎么使用...
    99+
    2023-07-02
  • 如何使用 C++ 函数实现多线程编程?
    如何使用 c++++ 函数实现多线程编程?创建一个带有可调用对象的 std::thread 对象。调用 join() 函数等待线程完成。使用互斥量、条件变量和信号量等线程同步技术来确保共...
    99+
    2024-04-26
    c++ 多线程编程 并发访问
  • C#如何使用异步委托开启线程
    这篇文章主要为大家展示了“C#如何使用异步委托开启线程”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何使用异步委托开启线程”这篇文章吧。异步委托开启线程 public ...
    99+
    2023-06-17
  • 如何使用Qt实现线程与定时器
    这篇文章主要介绍如何使用Qt实现线程与定时器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、定时器QTimer类The QTimer class provides repetitive and single-sho...
    99+
    2023-06-26
  • C++ 函数库如何创建和使用多线程?
    答案:在 c++++ 中,可以使用 std::thread 函数库创建和使用多线程以实现并发编程。详细描述:使用 std::thread 创建新线程,并在子线程中执行指定代码。使用同步机...
    99+
    2024-04-18
    c++ 多线程 同步机制
  • c语言线程编程是什么(c中线程的使用)
    C语言线程编程是指在C语言中使用多线程技术,通过创建和管理多个线程来实现并发执行的程序。在C语言中,可以使用线程库(如pthread...
    99+
    2023-09-22
    c语言
  • C#如何通过线程池开启线程
    小编给大家分享一下C#如何通过线程池开启线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过线程池开启线程 public static&nb...
    99+
    2023-06-17
  • Python中如何使用线程
    小编给大家分享一下Python中如何使用线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Python 中使用线程有两种方式:函数或者用类来包装线程对象。函数式:...
    99+
    2023-06-22
  • Python多线程如何使用
    今天小编给大家分享一下Python多线程如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一,实用方法线程之间执行是无序...
    99+
    2023-06-29
  • C#进度条使用之多线程应用如何实现
    这篇文章将为大家详细讲解有关C#进度条使用之多线程应用如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。让我们来看看具体的实现://声明一个委托 ,C#进度条使用之多线程应用 pu...
    99+
    2023-06-17
  • C++并发编程:如何进行线程同步与互斥?
    线程同步在多线程并发访问共享资源时至关重要。c++++ 提供了互斥体、条件变量和原子操作来实现同步。互斥体确保一次仅一个线程访问资源;条件变量用于线程间通信;原子操作可确保单个操作不可中...
    99+
    2024-05-05
    c++ 并发编程 并发访问 同步机制
  • C++并发编程:如何平衡线程数量与性能?
    在多线程环境中,最佳线程数量平衡并发性和性能至关重要。考虑以下因素:处理器的核心数、应用程序的计算负载和线程通信/同步成本。通过动态调整线程数量,例如使用 openmp 的 omp_se...
    99+
    2024-05-04
    c++ 并发编程
  • C#中如何使用多线程编程提高并发性能
    C#中如何使用多线程编程提高并发性能随着计算机技术的飞速发展,现代软件系统对于并发性能的需求也越来越高。尤其是在处理大量并发请求、并行计算以及IO密集型操作时,单线程往往无法充分利用CPU和其他系统资源,导致性能瓶颈和响应时间延长。而使用多...
    99+
    2023-10-22
    并发性能 C#多线程编程
  • 线程池与定时任务如何在Spring中使用
    这篇文章将为大家详细讲解有关线程池与定时任务如何在Spring中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.功能介绍Spring框架提供了线程池和定时任务执行的抽象接口:TaskE...
    99+
    2023-05-31
    spring 线程池
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作