C++ 面试题 目录

C++20 中 std::jthread 的用法?

推荐答案

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

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

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

本题详细解读

std::jthread 简介

std::jthread 是 C++20 中引入的一个新特性,它是 std::thread 的改进版本。与 std::thread 不同,std::jthread 在析构时会自动调用 join(),确保线程在对象销毁前完成执行。这避免了因忘记调用 join()detach() 而导致的资源泄漏或未定义行为。

std::jthread 的主要特点

  1. 自动管理线程生命周期std::jthread 在析构时会自动调用 join(),确保线程在对象销毁前完成执行。
  2. 支持停止请求std::jthread 可以与 std::stop_token 配合使用,允许线程在执行过程中响应停止请求。
  3. 简化线程管理:由于 std::jthread 自动管理线程的生命周期,开发者不需要显式调用 join()detach(),减少了出错的可能性。

std::jthread 的基本用法

  1. 创建线程:与 std::thread 类似,可以通过传递一个可调用对象(如函数、lambda 表达式等)来创建 std::jthread
  2. 自动等待线程结束std::jthread 在析构时会自动调用 join(),因此不需要显式调用 join()

示例代码解析

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

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

--- ------ -
    ------------ ----------  -- -------
    --------- -- ----- ------ ------- --- ------ -------------
    -- ------- ------------------- -------------
    ------ --
-
  • worker 函数:模拟一个耗时操作,线程会休眠 1 秒后输出一条消息。
  • std::jthread t(worker):创建一个 std::jthread 对象 t,并启动线程执行 worker 函数。
  • 自动等待线程结束:在 main 函数结束时,t 对象会被销毁,std::jthread 会自动调用 join(),确保 worker 线程执行完毕。

与 std::thread 的对比

  • std::thread:需要显式调用 join()detach(),否则会导致程序终止。
  • std::jthread:自动管理线程生命周期,简化了线程管理,减少了出错的可能性。

总结

std::jthread 是 C++20 中引入的一个非常有用的工具,它简化了线程管理,避免了因忘记调用 join()detach() 而导致的资源泄漏或未定义行为。通过自动管理线程生命周期,std::jthread 使得多线程编程更加安全和便捷。

纠错
反馈