pthread_join


在Linux中,新建的線程並不是在原先的進程中,而是系統通過一個系統調用clone()。該系統copy了一個和原先進程完全一樣的進程,並在這個進程中執行線程函數。不過這個copy過程和fork不一樣。 copy后的進程和原先的進程共享了所有的變量,運行環境。這樣,原先進程中的變量變動在copy后的進程中便能體現出來

那么pthread_join函數有什么用呢???

pthread_join使一個線程等待另一個線程結束。

代碼中如果沒有pthread_join主線程會很快結束從而使整個進程結束,從而使創建的線程沒有機會開始執行就結束了。加入pthread_join后,主線程會一直等待直到等待的線程結束自己才結束,使創建的線程有機會執行

所有線程都有一個線程號,也就是Thread ID。其類型為pthread_t。通過調用pthread_self()函數可以獲得自身的線程號。

在多線程編程的時候我們往往都是以for循環的形式調用pthread_join函數,既然運行prhtead_join之后主線程就阻塞了,也沒法調用后面的pthread_join,那么以for循環有什么用呢?

主線程是在第一個線程處掛起。

比如有:

pthread_join(1,NULL);

pthread_join(2,NULL);

pthread_join(3,NULL);

pthread_join(4,NULL);

pthread_join(5,NULL);

實際上主線程在pthread_join(1,NULL);這里就掛起了,在等待1號線程結束后再等待2號線程。

當然會出現3,4,5比1,2先結束的情況。主線程還是在等待1,2結束后,發現3,4,5其實早已經結束了,就會回收3,4,5的資源,然后主線程再退出。

 

 

 

 

pthread_join使一個線程等待另一個線程結束。
  代碼中如果沒有pthread_join;主線程會很快結束從而使整個進程結束,從而使創建的線程沒有機會開始執行就結束了。加入pthread_join后,主線程會一直等待直到等待的線程結束自己才結束,使創建的線程有機會執行。

  所有線程都有一個線程號,也就是threadid,其類型為pthread_t。 通過調用pthread_self()函數可以獲得自身的線程號。

  如果你的主線程,也就是main函數執行的那個線程,在你其他線程退出之前就已經退出,那么帶來的bug則不可估量。通過pthread_join函數會讓主線程阻塞,直到所有線程都已經退出。

  int pthread_join(pthread_t thread, void **value_ptr);
    thread:等待退出線程的線程號。
    value_ptr:退出線程的返回值。

  可以通過pthread_join()函數來使主線程阻塞等待其他線程退出,這樣主線程可以清理其他線程的環境。但是還有一些線程,更喜歡自己來清理退出 的狀態,他們也不願意主線程調用pthread_join來等待他們。我們將這一類線程的屬性稱為detached(分離的)。如果我們在調用 pthread_create()函數的時候將屬性設置為NULL,則表明我們希望所創建的線程采用默認的屬性,也就是jionable(此時不是detached)。

如果需要將屬性 設置為detached。則應該如下設定:

   pthread_attr_t  attr;

  pthread_attr_init(&attr);

  pthread_attr_setdetachstate(&attr,  PTHREAD_CREATE_DETACHED);

  pthread_create(&pthreadid,  &attr,  myprocess,  &arg);

警告:

  在線程設置為joinable后,可以調用pthread_detach()使之成為detached。但是相反的操作則不可以。還有,如果線程已經調用pthread_join()后,則再調用pthread_detach()則不會有任何效果。

線程可以通過自身執行結束來結束,也可以通過調用pthread_exit()來結束線程的執行。另外,線程甲可以被線程乙被動結束。這個通過調用pthread_cancel()來達到目的。

int pthread_cancel(pthread_t thread);

函數調用成功返回0。

當然,線程也不是被動的被別人結束。它可以通過設置自身的屬性來決定如何結束

  線程的被動結束分為兩種,一種是異步終結,另外一種是同步終結。異步終結就是當其他線程調用pthread_cancel的時候,線程就立刻被結束。而同 步終結則不會立刻終結,它會繼續運行,直到到達下一個結束點(cancellation point)。當一個線程被按照默認的創建方式創建,那么它的屬性是同步終結。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM