C++ 面试题 目录

C++ 中如何使用 std::packaged_task?

推荐答案

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

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

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

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

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

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

    ------ --
-

本题详细解读

1. std::packaged_task 是什么?

std::packaged_task 是 C++11 引入的一个类模板,用于包装一个可调用对象(如函数、lambda 表达式等),并将其执行结果与一个 std::future 对象关联。通过 std::packaged_task,你可以将任务的执行与结果的获取分离开来。

2. std::packaged_task 的使用步骤

  1. 创建 std::packaged_task 对象:你需要指定任务的签名(即函数的参数类型和返回类型),并将可调用对象传递给 std::packaged_task 的构造函数。

  2. 获取 std::future 对象:通过调用 get_future() 方法,你可以获得一个与 std::packaged_task 关联的 std::future 对象。这个 std::future 对象可以用来获取任务的执行结果。

  3. 执行任务:你可以通过调用 std::packaged_task 对象的 operator() 来执行任务,或者将其传递给一个线程(如 std::thread)来异步执行。

  4. 获取结果:通过 std::future 对象的 get() 方法,你可以获取任务的执行结果。如果任务尚未完成,get() 会阻塞当前线程,直到任务完成。

3. 代码解析

  • 创建 std::packaged_task:在示例中,我们创建了一个 std::packaged_task<int(int, int)> 对象,它包装了一个 lambda 函数,该函数接受两个整数并返回它们的和。

  • 获取 std::future:通过 task.get_future() 获取与 std::packaged_task 关联的 std::future 对象。

  • 执行任务:我们将 std::packaged_task 对象移动到 std::thread 中,并在新线程中执行任务。

  • 获取结果:在主线程中,我们通过 result.get() 获取任务的执行结果,并输出到控制台。

4. 注意事项

  • std::packaged_task 对象是不可复制的,但可以通过 std::move 进行移动。
  • std::futureget() 方法只能调用一次,调用后 std::future 对象将变为无效状态。
  • 如果任务抛出异常,std::futureget() 方法会重新抛出该异常。
纠错
反馈