深入了解C++11中promise和future的使用

深入了解C++11中promise和future

什么是promise和future

在C++11标准中,promisefuture是一对用于线程间通信的重要工具。其中,promise负责提供使用者一个方式去异步生成一个值;future则提供了一种方式去访问这个值,或者等待这个值的生成。

可以将promise看作是一个值得承诺,而future则是对这个承诺的期望,而shared_future则是对这个承诺的同时使用。

如何使用

以下是一个简单的使用案例:

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

using namespace std;

void worker(promise<int> promise_obj) {
    cout << "Worker is working..." << endl;
    promise_obj.set_value(42);
}

int main() {
    promise<int> promise_obj;
    future<int> future_obj = promise_obj.get_future();

    thread t(worker, move(promise_obj));
    t.join();

    cout << "Result: " << future_obj.get() << endl;
    return 0;
}

在这个案例中,worker函数在新的线程内部执行。我们通过promise_obj对象提供了给这个任务一个承诺:在处理后使用set_value方法设置一个值。在主线程中,我们通过promise_obj对象获取了一个future_obj对象,使用future_obj.get()等待这个承诺的结果。

更多例子

这里介绍另一个简单的例子,实现两个同时开始的线程交换信息的功能:

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

using namespace std;

void worker1(promise<string> promise_obj) {
    string data = "Hello from worker1";
    cout << "Worker1 is working..." << endl;
    this_thread::sleep_for(chrono::seconds(1));
    promise_obj.set_value(data);
}

void worker2(promise<string> promise_obj, future<string> future_obj) {
    cout << "Worker2 is waiting..." << endl;
    auto result = future_obj.get();
    string data = "Hello back from worker2: " + result;
    cout << "Worker2 is working..." << endl;
    this_thread::sleep_for(chrono::seconds(1));
    promise_obj.set_value(data);
}

int main() {
    promise<string> promise1;
    promise<string> promise2;
    future<string> future1 = promise1.get_future();
    future<string> future2 = promise2.get_future();

    thread t1(worker1, move(promise1));
    thread t2(worker2, move(promise2), move(future1));

    t1.join();
    t2.join();

    cout << "Result: " << future2.get() << endl;
    return 0;
}

在这个例子中,我们有两个线程:worker1worker2。在worker1中,我们创建了一个字符串,并将其设置为promise1的值。在worker2中,我们需要等待promise1的结果出现后,在此基础上创建一个新的字符串,并将其作为promose2的值。

值得注意的是,要调用std::move(promise1)std::move(future1)是为了确保线程内的完整性,即保证这些对象不会被拷贝。最后,我们再通过future2.get()进行等待,以得到最终的结果。

总结

通过promisefuture的使用,我们可以很容易地在不同线程中交换状态和数据。因此,promisefuture是用于在线程同步和通信方面的有用的工具。

但是,需要注意的是如果在使用promisefuture时,必须始终确保线程的安全。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解C++11中promise和future的使用 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 浅谈JSON.parse()和JSON.stringify()

    浅谈JSON.parse()和JSON.stringify() JSON.parse()和JSON.stringify()是JavaScript中常用的JSON数据解析和生成方法,它们可以让我们轻松地将JavaScript的对象或数组转换为JSON格式,或者将JSON格式的数据转换为JavaScript的对象或数组。本文将从以下几个方面进行详细讲解: JSO…

    C 2023年5月23日
    00
  • 一文教你Qt如何操作SQLite数据库

    一文教你Qt如何操作SQLite数据库 1. 安装SQLite数据库驱动 在Qt中操作SQLite数据库,需要使用到SQLite数据库驱动。下面介绍如何安装和配置这个驱动。 1.1 下载SQLite 访问 SQLite官网 ,选择最新的预编译二进制文件下载。 1.2 下载SQLite驱动 访问Qt官网的下载页面,选择对应版本的Qt安装程序。这里以Qt 5.1…

    C 2023年5月22日
    00
  • C语言实现队列的示例详解

    C语言实现队列的示例详解 简介 队列是一种常用的数据结构,类似于排队,先进先出。C语言中可以使用结构体、数组、指针等方式来实现队列。本文将介绍如何使用数组实现队列。 实现过程 使用数组实现队列需要定义两个指针:一个指向队列头,一个指向队列尾。 1. 定义队列结构体 结构体定义如下,其中front为队列头指针,rear为队列尾指针,maxSize为队列容量,a…

    C 2023年5月23日
    00
  • C语言传递简单字符串

    C语言传递简单字符串 在C语言中,传递简单字符串有两种方式:指针和字符数组。以下分别介绍这两种方式的使用方法。 使用指针传递简单字符串 在C语言中,传递字符串的方式通常是通过使用指针。 指针是一种引用类型,它存储了内存地址的值。C语言中字符串实际上是由一系列字符组成的字符数组,它们在内存中是连续存储的。一个指针可以指向字符数组的第一个元素,也就是字符串的首地…

    C 2023年5月9日
    00
  • 从零学习构造系统之bazel示例详解

    从零学习构造系统之bazel示例详解 简介 本文将详细讲解使用bazel构建系统的过程。Bazel是由Google开发的构建工具,其目的是为了更快、更可靠地构建软件。Bazel不仅支持多种语言的构建,如Java、C++、Python等等,而且具有增量构建和缓存等强大的功能。 安装Bazel 首先,我们需要安装Bazel。可以在Bazel的官方网站(https…

    C 2023年5月23日
    00
  • C++11 并发指南之Lock 详解

    C++11 并发指南之 Lock 详解 什么是 Lock Lock 是一种同步机制,用于保护共享资源以避免并发访问。当多个线程访问同一个共享资源时,Lock 可以确保每个线程在使用共享资源时都是互斥的,从而避免竞态条件(Race Condition)和内存相关的不一致性问题。 Lock 的使用方法 C++11 中提供了两种 Lock 的实现方式:std::m…

    C 2023年5月22日
    00
  • C 程序 二进制转换为八进制

    下面是关于“C 程序 二进制转换为八进制”的完整使用攻略。 标题 C 程序二进制转换为八进制的完整使用攻略 介绍 在计算机领域中,二进制和八进制是两种常用的进制。我们可以使用 C 程序将二进制数字转换为八进制数字。在本文中,我们将讨论如何实现这项任务。 步骤 以下是将二进制转换为八进制的步骤: 我们需要在程序中接受一个二进制数字输入。 将输入的二进制数进行逐…

    C 2023年5月9日
    00
  • C语言 按引用函数调用

    当我们在C语言中使用函数调用时,可以通过传递指针的方式来实现按引用传递。这样可以使我们在函数内操作原始变量的值,而不是复制一份它的值。以下是完整的C语言按引用函数调用的使用攻略: 函数声明 在定义函数时,加上*运算符来指明参数是一个指针,如下面的例子: void swap(int *x, int *y); 函数定义 定义函数时,如下面的例子,使用*运算符从参…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部