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_sourcestop_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_tokenstop_source,可以使用get_stop_token()get_stop_source()方法。

参考资料

  • 飘零的落花 - 现代C++详解
  • C++20高级编程