In Boost.Thread der Start-Funktion, die Quellcode ist so etwas wie die:Warum "boost.thread" "intrusive_ptr_add_ref" manuell aufrufen?
bool thread::start_thread_noexcept()
{
uintptr_t const new_thread = _beginthreadex(
0,
0,
&thread_start_function,
thread_info.get(),
CREATE_SUSPENDED,
&thread_info->id);
if (!new_thread)
{
return false;
}
// why call this line?
intrusive_ptr_add_ref(thread_info.get());
thread_info->thread_handle = (detail::win32::handle)(new_thread);
ResumeThread(thread_info->thread_handle);
return true;
}
thread_info ist ein intrusive intelligenten Zeiger, der auf die Faden Informationsdaten zeigt, bevor die intrusive_ptr_add_ref Aufruf, ist die Zählung bereits 1, I Ich weiß nicht, warum man die intrusive_ptr_add_ref hier manuell aufruft. Ich denke, der Job des intrusiven intelligenten Zeigers sollte die intrusive_ptr_add_ref- und intrusive_ptr_release automatisch aufrufen.
Ich habe versucht, durch den Quellcode zu gehen, fand aber keine Hinweise.
Kann mir jemand sagen 1. warum intrusive_ptr_add_ref hier manuell aufrufen? 2. In welchem Zustand sollte intrusive_ptr intrusive_ptr_add_ref manuell aufgerufen werden?
Danke, Mit freundlichen Grüßen.
Vielen Dank! Ihre Antwort ist so wertvoll und enthüllt alles! – zach