背景
工作线程创建后,主线程退出,未join工作线程,进程收到abort信号产生core文件
原因
~thread()
{
if (joinable())
std::terminate();
}
任何情况下, std::terminate
调用当前安装的 std::terminate_handler 。默认的 std::terminate_handler 调用 std::abort 。
// gcc-9.1.0/c/libsupc++/eh_terminate.cc
void
__cxxabiv1::__terminate (std::terminate_handler handler) throw ()
{
__try
{
handler ();
std::abort ();
}
__catch(...)
{ std::abort (); }
}
void
std::terminate () throw()
{
__terminate (get_terminate ());
}
/// If you write a replacement %terminate handler, it must be of this type.
// typedef void (*terminate_handler) ();
std::terminate_handler
std::set_terminate (std::terminate_handler func) throw()
{
std::terminate_handler old;
#if ATOMIC_POINTER_LOCK_FREE > 1
__atomic_exchange (&__terminate_handler, &func, &old, __ATOMIC_ACQ_REL);
#else
__gnu_cxx::__scoped_lock l(mx);
old = __terminate_handler;
__terminate_handler = func;
#endif
return old;
}
std::terminate_handler
std::get_terminate () noexcept
{
std::terminate_handler func;
#if ATOMIC_POINTER_LOCK_FREE > 1
__atomic_load (&__terminate_handler, &func, __ATOMIC_ACQUIRE);
#else
__gnu_cxx::__scoped_lock l(mx);
func = __terminate_handler;
#endif
return func;
}