簡體   English   中英

NPTL 中的線程如何退出?

[英]How does a thread in NPTL exit?

從實現的角度來看,我很好奇單個 NPTL 線程是如何退出的。

我對glibc-2.30的實現的理解是:

  1. NPTL 線程建立在 Linux 上的輕量級進程之上,附加信息存儲在用戶堆棧的 pthread object 中,以跟蹤 NPTL 特定信息,例如加入/分離狀態和返回的對象的指針。
  2. 當一個 NPTL 線程完成后,它就永遠消失了,只有用戶堆棧(以及因此)pthread object 被收集(由其他線程加入),除非它是分離的,在這種情況下,空間是直接的釋放。
  3. _exit()系統調用殺死線程組中的所有線程。
  4. pthread_create()接收的用戶 function 實際上被包裝到另一個 function start_thread()中,它在運行用戶 ZC1C425268E68385D1AB5074C17A94 之前做了一些准備工作。

問題是:

  1. 在包裝器 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()因為它會終止所有線程。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM