pthread_join

在Linux中,新建的線程並非在原先的進程中,而是系統經過一個系統調用clone()。該系統copy了一個和原先進程徹底同樣的進程,並在這個進程中執行線程函數。不過這個copy過程和fork不同。 copy後的進程和原先的進程共享了全部的變量,運行環境。這樣,原先進程中的變量變更在copy後的進程中便能體現出來編程

那麼pthread_join函數有什麼用呢???多線程

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

代碼中若是沒有pthread_join主線程會很快結束從而使整個進程結束,從而使建立的線程沒有機會開始執行就結束了。加入pthread_join後,主線程會一直等待直到等待的線程結束本身才結束,使建立的線程有機會執行函數

全部線程都有一個線程號,也就是Thread ID。其類型爲pthread_t。經過調用pthread_self()函數能夠得到自身的線程號。spa

在多線程編程的時候咱們每每都是以for循環的形式調用pthread_join函數,既然運行prhtead_join以後主線程就阻塞了,也無法調用後面的pthread_join,那麼以for循環有什麼用呢?線程

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

好比有:資源

pthread_join(1,NULL);同步

pthread_join(2,NULL);it

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)。當一個線程被按照默認的建立方式建立,那麼它的屬性是同步終結。

相關文章
相關標籤/搜索