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

c++ std::future 和 std::promise 的实现工作原理简介

为了便于理解 std::futurestd::promise 的实现工作原理,我们可以创建一个简化的版本。这包括共享状态、Promise 设置值、Future 获取值的核心机制。我们的示例代码将实现 SimplePromiseSimpleFuture 两个类,二者通过一个共享状态实现线程间的通信和同步。

实现代码

1. 定义共享状态

共享状态是 PromiseFuture 之间共享的数据区域,用于存储值以及同步访问。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <optional>

template <typename T>
class SharedState {
public:
    // 设置值
    void set_value(T value) {
        std::lock_guard<std::mutex> lock(mtx_);
        value_ = value;
        ready_ = true;
        cv_.notify_all();
    }

    // 获取值(阻塞直到值设置完成)
    T get_value() {
        std::unique_lock<std::mutex> lock(mtx_);
        cv_.wait(lock, [this] { return ready_; });
        return *value_;
    }

private:
    std::mutex mtx_;
    std::condition_variable cv_;
    std::optional<T> value_;  // 使用optional来保存值(类似于指针,但更安全)
    bool ready_ = false;      // 表示是否设置了值
};
2. 实现 SimplePromise

SimplePromise 用于设置共享状态中的值。其主要功能包括创建共享状态实例,并在 set_value 中向状态中写入值。

template <typename T>
class SimplePromise {
public:
    SimplePromise() : state_(std::make_shared<SharedState<T>>()) {}

    // 设置值并通知 future
    void set_value(T value) {
        state_->set_value(value);
    }

    // 获取 future 对象
    std::shared_ptr<SharedState<T>> get_state() {
        return state_;
    }

private:
    std::shared_ptr<SharedState<T>> state_;
};
3. 实现 SimpleFuture

SimpleFuture 从共享状态中获取值,并在 get 中阻塞等待值设置完成。

template <typename T>
class SimpleFuture {
public:
    SimpleFuture(std::shared_ptr<SharedState<T>> state) : state_(state) {}

    // 获取值(会阻塞,直到值设置完成)
    T get() {
        return state_->get_value();
    }

private:
    std::shared_ptr<SharedState<T>> state_;
};

4. 连接 SimplePromiseSimpleFuture

为了实现 std::promisestd::future 的连接,我们让 SimplePromise 创建共享状态实例,并通过该实例创建 SimpleFuture

template <typename T>
std::pair<SimplePromise<T>, SimpleFuture<T>> make_promise_future() {
    SimplePromise<T> promise;
    SimpleFuture<T> future(promise.get_state());
    return {promise, future};
}

使用示例

下面的示例展示了如何使用 SimplePromiseSimpleFuture 进行线程间的值传递。

int main() {
    // 创建 promise 和 future
    auto [promise, future] = make_promise_future<int>();

    // 启动线程异步设置值
    std::thread t([&promise]() {
        std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟延迟
        promise.set_value(42);
        std::cout << "值已设置为 42" << std::endl;
    });

    // 主线程等待并获取结果
    std::cout << "等待结果..." << std::endl;
    int result = future.get();
    std::cout << "获取到结果: " << result << std::endl;

    t.join(); // 等待线程结束
    return 0;
}

代码流程解析

  1. 共享状态SharedState 负责存储值,set_value 在设置值后通知等待的线程,get_value 阻塞直到值被设置。
  2. SimplePromise:管理 SharedState 并设置值。
  3. SimpleFuture:等待并获取值。
  4. make_promise_future:帮助创建关联的 SimplePromiseSimpleFuture 对象。

工作流程图

+----------------+      +-------------------+       +----------------+
|   Thread 1     |      |   Shared State    |       |   Thread 2     |
+----------------+      +-------------------+       +----------------+
| SimplePromise  | ---> |  set_value(val)   | <---  | SimpleFuture   |
|                |      |   value = val     |       | get() blocking |
|   set_value(42)|      |  ready = true     |       | until ready    |
+----------------+      +-------------------+       +----------------+

总结

在这个实现中:

  • SimplePromise 通过共享状态的指针持有对共享状态的唯一引用。
  • SimpleFutureget 方法中阻塞,直到 SimplePromiseset_value 中通知共享状态已经就绪。
  • 共享状态通过条件变量和互斥锁确保线程安全,实现了异步值传递。

http://www.kler.cn/news/356095.html

相关文章:

  • 获取非加密邮件协议中的用户名和密码——安全风险演示
  • 操作系统任务操作
  • CTFHUB技能树之SQL——Refer注入
  • 滚雪球学Redis[6.4讲]:Redis消息队列:构建高效的消息通信与任务调度系统
  • PyTorch 的 Dataset 类介绍
  • 构建行业应用生态:云原生应用市场简化企业软件安装
  • 【ChatGPT】如何让 ChatGPT 理解多步骤指令
  • 使用Riotee轻松实现无电池TinyML
  • .net 根据html的input type=“week“控件的值获取星期一和星期日的日期
  • 【基础篇】AOF日志:宕机了,Redis如何避免数据丢失?
  • JAVA使用easyExcel导出数据到EXCEl,导出数据不全问题解决
  • 智慧社区Web平台:Spring Boot技术实现
  • 25面向OBject-c语言的超详细知识点教程整理
  • HarmonyOS开发(State模型)
  • 计算机毕业设计Python+Flask智慧交通 客流量分析预测 交通大数据 线性回归预测 大数据毕业设计 数据可视化 人工智能
  • Java:获取视频文件的视频时长
  • springboot031教师工作量管理系统(论文+源码)_kaic
  • 基于SpringBoot的高校竞赛管理系统:设计与实现
  • 【大模型】AI视频课程制作工具开发
  • (JAVA)贪心算法、加权有向图与求得最短路径的基本论述与实现