C++ 面试题 目录

C++ 中 std::future 和 std::promise 的用法?

推荐答案

-- -------------------- ---- -------
-------- ----------
-------- --------
-------- --------

---- ------------------------ ----- -
    -- --------
    -----------------------------------------------------
    -------------------  -- -- ------- --
-

--- ------ -
    ----------------- -----
    ---------------- --- - ------------------  -- --- ------- --- ------

    ----------- ------- -----------------  -- --------

    --------- -- -------- --- --- ---------- -- ----------
    --- ------ - ----------  -- ---- ------ ---
    --------- -- -------- - -- ------ -- ----------

    ---------  -- ------
    ------ --
-

本题详细解读

std::promise 和 std::future 的作用

std::promisestd::future 是 C++11 引入的用于线程间通信的工具。它们通常用于在一个线程中设置一个值,并在另一个线程中获取该值。

  • std::promise: 用于存储一个值或异常,并允许在稍后的时间点通过 std::future 获取该值。
  • std::future: 用于获取与 std::promise 关联的值或异常。它提供了一种异步获取结果的机制。

代码解析

  1. 创建 promise 和 future:

    • std::promise<int> prom; 创建一个 promise 对象,用于存储一个 int 类型的值。
    • std::future<int> fut = prom.get_future(); 获取与 promise 关联的 future 对象,用于在稍后获取 promise 中存储的值。
  2. 启动线程执行任务:

    • std::thread t(task, std::move(prom)); 启动一个新线程,并将 promise 对象传递给任务函数 taskstd::move(prom) 用于将 promise 对象的所有权转移给线程。
  3. 任务函数:

    • task 函数中,模拟了一些耗时操作(如 std::this_thread::sleep_for),然后通过 prom.set_value(42); 设置 promise 的值为 42
  4. 获取结果:

    • 在主线程中,int result = fut.get(); 阻塞等待 future 的结果,直到 promise 中的值被设置。一旦 promise 的值被设置,future 就会返回该值。
  5. 线程同步:

    • t.join(); 确保主线程等待任务线程完成后再继续执行。

使用场景

std::promisestd::future 通常用于以下场景:

  • 异步任务的返回值传递。
  • 线程间的同步和数据传递。
  • 实现类似于回调的机制,但更加灵活和类型安全。

注意事项

  • std::futureget() 方法只能调用一次,调用后 future 对象将变为无效。
  • std::promisestd::future 是线程安全的,可以在多线程环境中安全使用。
  • 如果 promise 在未设置值的情况下被销毁,futureget() 方法将抛出 std::future_error 异常。
纠错
反馈