2010-05-12 36 views
9

我對線程有點新,所以你不得不原諒這個問題的天真。pthread_join是如何實現的?

pthread_join是如何實現的?它是如何影響線程調度的?

我總是使用while循環實現圖片pthread_join,只是導致調用線程退出,直到目標線程完成。像這樣(非常近似的僞代碼):

 

atomic bool done; 

thread_run { 

    do_stuff(); 
    done = true; 

} 

thread_join { 

    while(!done) { 
     thread_yield(); 
    // basically, make the thread that calls "join" on 
    // our thread yield until our thread completes 
    } 
} 

這是一個準確的描述,還是我大大簡化了過程?

乾杯!

回答

3

是的,這是一般的想法。有關特定實施的詳細信息,請參閱glibc

+2

他的代碼和真實代碼之間唯一真正的巨大差異是如果有備用核心,他的代碼會導致加入的線程燒掉100%的CPU。 – 2011-08-30 13:10:38

4

pthread_join可能在內部實現爲等待線程退出時觸發的信號量,無論是在調用pthread_exit還是在其主函數退出時觸發。

在任何情況下,glibc的源代碼可用,嘗試谷歌代碼搜索(我看到一些資料性的東西在裏面)

+0

https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/pthread_join.c;h=6a87a8b329c3e34a57d65e86d45fa97a5fdb2fe2;hb=master#l89的是神奇之處就行了。 – Benoit 2017-06-07 06:30:52

1

線程通常具有與之相關聯的小結構,線程上下文。該結構可以塞滿使線程「工作」所需的所有數據。

例如,數據結構的根需要訪問該線程的線程特定的鍵,並且在它關閉時迭代它們以清除它們。

該結構中通常有一個類似於互斥體的鎖,對於不同的部分可能有多個鎖。

線程上下文可以有一個小字段在終止線程可以放置其退出狀態。 (void *pthread_exit返回或從線程函數返回。)

線程上下文還可以指示線程的狀態(尚未創建,正在運行,已停止)。

可能存在一個同步原語,例如條件變量或信號量,在準備終止狀態並指示它正在終止之後,線程可以使用該同步原語kick

pthread_join函數可以等待該同步原語。一旦等待完成,該函數可以觸發該線程的資源清除,並將狀態提取出來。

線程在發出加入信號後繼續執行。要做到這一點,它必須繼續有一個堆棧的上下文。在那之後,系統必須解決在後臺乾淨地停止線程的問題。

線程的用戶空間實現可以將其推遲到內核。例如。一些信號可能熄滅或者表示線程已經完成。此時,用戶空間知道線程不可能再使用堆棧,並且可以回收它。

在內核中,調度程序可以「吃」一個線程。該線程可以調用調度程序中的一些函數,該函數在清除大部分資源後永遠不會返回。它將線程標記爲死亡並將上下文切換到另一個線程。線程的堆棧永遠不會再被使用(因爲該函數永遠不會返回),並且可以回收它的任務結構以及任何附加的東西。