[英]How does a thread in NPTL exit?
從實現的角度來看,我很好奇單個 NPTL 線程是如何退出的。
我對glibc-2.30的實現的理解是:
_exit()
系統調用殺死線程組中的所有線程。pthread_create()
接收的用戶 function 實際上被包裝到另一個 function start_thread()
中,它在運行用戶 ZC1C425268E68385D1AB5074C17A94 之前做了一些准備工作。問題是:
在包裝器 function start_thread()
的末尾,有以下注釋和代碼:
/* We cannot call '_exit' here. '_exit' will terminate the process. The 'exit' implementation in the kernel will signal when the process is really dead since 'clone' got passed the CLONE_CHILD_CLEARTID flag. The 'tid' field in the TCB will be set to zero. The exit code is zero since in case all threads exit by calling 'pthread_exit' the exit status must be 0 (zero). */ __exit_thread ();
但__exit_thread()
似乎無論如何都在做系統調用_exit()
:
static inline void __attribute__ ((noreturn, always_inline, unused)) __exit_thread (void) { /* some comments here */ while (1) { INTERNAL_SYSCALL_DECL (err); INTERNAL_SYSCALL (exit, err, 1, 0); } }
所以我在這里很困惑,因為它不應該真正執行系統調用_exit()
因為它會終止所有線程。
pthread_exit()
應該終止單個線程,因此它應該執行類似於包裝器start_thread()
最后所做的事情,但是它調用__do_cancel()
,並且TBH 我迷失在追查那個 function 中。 它似乎與上面的__exit_thread()
,也沒有調用_exit()
。我在這里很困惑,因為它不應該真正做系統調用 _exit()
這里的混淆源於將exit
系統調用與_exit
libc 例程混合在一起(Linux 上沒有_exit
系統調用)。
前者終止當前的 Linux 線程(如預期的那樣)。
后者(令人困惑)不執行exit
系統調用。 相反,它執行exit_group
系統調用,終止所有線程。
thread_exit() 應該終止單個線程
它確實,間接地。 它展開當前堆棧(類似於siglongjmp
),將控制轉移到設置cleanup_jmp_buf
的位置。 那是在start_thread
。
控制轉移后, start_thread
清理資源,並調用__exit_thread
實際終止線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.