C++11以来提供了C++原生的多线程std::thread,这极大的方便了多线程的书写。在此之前书写多线程时需要平台原生API,这对于跨平台尤其是跨多平台程序来讲,代码书写及维护都是极大的工作量。std::thread具有非常高的优势,但是其也有自己的缺点,以下代码为例,
void using_thread_with_no_join()
{
std::thread t{
[](){
std::cout<<"sub thread execate, thread id"<<std::this_thread::get_id();
}};
}
运行如上代码时,会出现崩溃,堆栈信息如下,
由如上堆栈信息可知,崩溃原因为std::thread在析构时,如果对象仍为joinable状态,则会触发中断,为避免崩溃需要在std::thread析构器前需要将其置于非joinable状态,即需要主动调用join或detach接口。如果忘记了便会出现如上的崩溃。
既然已经有了RAII思想了,那必然是可以通过该思想来解决忘记join或detach导致崩溃的问题。所以std::jthread应运而生。当然std::jthread不止于此。
std::jthread
剖析其源码是了解其机理的最好方法,std::jthread的部分源码整理如下:
#if _HAS_CXX20
class jthread {
public:
jthread() noexcept : _Impl{
}, _Ssource{
nostopstate} {
}
template <class _Fn, class... _Args, enable_if_t<!is_same_v<remove_cvref_t<_Fn>, jthread>, int> = 0>
_NODISCARD_CTOR explicit jthread(_Fn&& _Fx, _Args&&... _Ax) {
//-------
}
~jthread() {
_Try_cancel_and_join();
}
jthread(const jthread&) =