深入了解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日

相关文章

  • C语言实现经典扫雷小游戏的示例代码

    下面我将为您提供C语言实现经典扫雷小游戏的示例代码的完整攻略。 准备工作 在开始编写代码之前,需要准备好以下工作: 确定游戏的规则和难度等级; 准确计算雷区的总大小、雷数等信息; 确定游戏界面的元素,例如雷区的格子、计时器、分数等; 使用C语言编写代码所需的IDE和编译器等工具。 编写代码 下面是基于C语言实现经典扫雷小游戏的示例代码: #include &…

    C 2023年5月23日
    00
  • 关于C++的.cpp文件运行全过程

    C++是一种高级别的编程语言,其源代码需要经过编译器的编译和链接过程,才能转化为可以运行的可执行文件。下面是C++的.cpp文件运行全过程的完整攻略: 1. C++代码编写 C++代码需要用到文本编辑器进行编写,常见的文本编辑器有Visual Studio Code、Sublime Text、Atom等。编写代码时需要注意遵循C++的语法规则,可以使用函数、…

    C 2023年5月23日
    00
  • C语言有哪些特点?

    C语言是一种高级编程语言,具有以下特点: 1. 语言简洁、紧凑 相对于其他编程语言,C语言的核心语法非常简单且紧凑,没有过多的冗余语法,使得程序员可以快速地入手。同时,C语言提供了相对较少的预定义函数(如printf, scanf等),大部分函数都需要自己定义,这也有利于程序员更深入地理解计算机程序的本质。 例如,以下是C语言的“Hello World”程序…

    C 2023年4月27日
    00
  • C++实现简单通讯录管理系统

    C++实现简单通讯录管理系统攻略 目标 实现一个简单的通讯录管理系统,可以进行添加联系人、删除联系人、修改联系人和显示联系人等操作。程序的主要功能如下: 添加联系人:输入姓名、性别、年龄、电话及地址信息,添加一个联系人信息到通讯录中。 显示联系人:显示通讯录中的所有联系人信息。 删除联系人:输入要删除联系人的姓名,从通讯录中删除该联系人的信息。 查找联系人:…

    C 2023年5月23日
    00
  • Spring Boot全局异常处理解析

    下面是关于Spring Boot全局异常处理解析的完整攻略,包括了详细的讲解和示例说明。 什么是全局异常处理 在 Spring Boot 中,我们可以使用 @ControllerAdvice 注解来定义一些全局的异常处理方法,这些方法可以捕获到应用程序中可能出现的异常,并进行特定的处理。全局异常处理能够提供更友好的错误信息,方便开发人员和用户进行错误排查和解…

    C 2023年5月23日
    00
  • C语言实现通用数据结构之通用集合(HashSet)

    C 语言实现通用数据结构之通用集合(HashSet) 什么是 HashSet HashSet 是一种常用的数据结构,其实质就是一个无序不重复的元素集合。在 C 语言中,你可以使用 HashSet 存储任何类型的数据。 HashSet 的优点在于: 独立性,只关心数据的存储和操作,而不必关心数据类型; 方便性,对于处理过程,比起普通数组无需考虑顺序问题。 实现…

    C 2023年5月23日
    00
  • C语言代码实现简单扫雷小游戏

    下面我会详细讲解“C语言代码实现简单扫雷小游戏”的完整攻略。 1. 游戏规则 扫雷是一款益智小游戏,其主要规则如下: 游戏区域是一个由方块组成的网格,每个方块是未被挖开的地雷、数字或空白格子。 玩家需要通过揭示方块,来确定地雷的位置。 如果玩家揭示的方块是地雷,游戏失败。 如果玩家揭示的方块是数字,表示周围八个方块中地雷的数量。 如果玩家揭示的方块是空白格子…

    C 2023年5月22日
    00
  • 基于c语言中调试工具的用法汇总(不包含gdb)

    基于C语言中调试工具的用法汇总 在C语言程序的开发中,我们常常需要使用调试工具来对代码进行调试。本文将会汇总介绍一些常用的调试工具及其用法。 1. 什么是调试? 调试(Debugging)指在软件开发的过程中,从已有代码中逐步排除一个个错误,以达到使程序能够符合预期要求,并达到较高的可靠性与较好的性能优化的过程。调试的过程常常需要使用调试工具。 2. 常用的…

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