3 - 自动join线程
在C++20中引入了std::jthread
,和之前的std::thread
相比,它:
- 在析构函数中自动
join()
,防止应用程序被意外终止 - 支持所谓的协作式取消,即这种线程需要定期检查它是否需要取消自己
本文将简要介绍一下它的用法。
自动join线程
两个关键类
在使用jthread
之前,先引入两个关键类,它们定义在<stop_token>
中:
std::stop_token
:支持主动检查取消的请求。一个可取消线程需要定期在stop_token
上调用stop_requested()
,以确定是否需要停止它的工作。stop_token
可以和condition_variable_any
一起使用,这样线程在需要停止时就可以被唤醒。std::stop_source
:用于请求线程取消执行。通过调用stop_source
上的request_stop()
方法来完成。如果stop_source
被用于请求取消,那么该停止请求对所有相关的stop_source
和stop_token
均可见。
示例
接下来使用jthread
和lambda表达式,把正在执行的线程A用线程B停止:
jthread a {[](stop_token token)
{
cout << "A start Working...\n";
while (!token.stop_requested())
{
// do something
}
cout << "A cancel working...\n";
}};
jthread b {[&a]
{
cout << "B tried stop A...\n";
a.request_stop();
}};
可能执行结果如下:
A start Working...
B tried stop A...
A cancel working...
要从jthread
中直接访问stop_token
和stop_source
,可以使用get_stop_token()
和get_stop_source()
方法。
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程