主要观点:
- C++研讨会中典型问题是线程能否被杀死,C++20 前答案为否,C++20 可礼貌请求线程中断。
- 杀死线程不是好主意,可能导致线程未完成工作或处于临界区锁 mutex 时被杀死而引发死锁等问题。
- C++20 中协作中断基于
std::stop_token
、std::stop_callback
和std::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
的各种状态判断函数。 - 展示了禁用和启用线程接受停止请求的代码片段。
- 示例中十个线程的运行过程及回调触发时机。
- 提到文章重复的原因及感谢的赞助者等信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。