C++20 中线程的协作中断 - MC++ 博客

主要观点:

  • C++研讨会中典型问题是线程能否被杀死,C++20 前答案为否,C++20 可礼貌请求线程中断。
  • 杀死线程不是好主意,可能导致线程未完成工作或处于临界区锁 mutex 时被杀死而引发死锁等问题。
  • C++20 中协作中断基于std::stop_tokenstd::stop_callbackstd::stop_source数据类型,std::stop_source可处理停止请求,std::stop_token可检查停止请求状态,可临时禁用std::stop_token
  • 示例展示了使用std::jthread和回调函数,十个线程调用 lambda 函数,在主线程睡眠和子线程睡眠后触发回调。
  • std::jthread克服了std::thread的一个弱点,可自动连接且可中断。
  • 此篇是 3 年半前文章的重复,是后续文章的前提。

关键信息:

  • C++20 前不能杀死线程,之后可请求中断。
  • 杀死线程的两种恶意结果。
  • std::stop_source的两种构造方式及相关成员函数。
  • std::stop_token的相关函数及默认构造情况。
  • 示例中std::jthread的使用及回调触发。

重要细节:

  • 给出了std::jthread构造函数的两种形式及作用。
  • 详细说明了std::stop_source的成员函数及std::stop_token的各种状态判断函数。
  • 展示了禁用和启用线程接受停止请求的代码片段。
  • 示例中十个线程的运行过程及回调触发时机。
  • 提到文章重复的原因及感谢的赞助者等信息。
阅读 16
0 条评论