Я запутался здесь, так как он действительно не должен выполнять syscall _exit ()
Путаница здесь возникает из-за смешивания системного вызова exit
с _exit
lib c подпрограмма (системный вызов _exit
для Linux отсутствует).
Первый завершает текущий Linux поток (как задумано).
Второй (сбивает с толку) не выполнить системный вызов exit
. Скорее, он выполняет системный вызов exit_group
, который завершает все потоков.
thread_exit () должен завершать один поток
Это делает, косвенно. Он раскручивает текущий стек (аналог siglongjmp
), выполняя передачу управления в точку, где был установлен cleanup_jmp_buf
. И это было в start_thread
.
После передачи управления start_thread
очищает ресурсы и вызывает __exit_thread
для фактического завершения потока.