pthread_join(),pthread_exit(),pthread_detach()

簡介

  • pthread有兩種狀態joinable狀態(屬性)和unjoinable狀態,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所佔用堆棧和線程描述符。只有當你調用了pthread_join之後這些資源纔會被釋放。若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。
  • unjoinable屬性可以在pthread_create時指定,或在線程創建後在線程中pthread_detach自己, 如:pthread_detach(pthread_self()),將狀態改爲unjoinable狀態,確保資源的釋放。或者將線程置爲 joinable,然後適時調用pthread_join.
  • 其實簡單的說就是在線程函數頭加上 pthread_detach(pthread_self())的話,線程狀態改變,在函數尾部直接 pthread_exit線程就會自動退出。省去了給線程擦屁股的麻煩。
  • pthread_exit實際就類似於進程的exit,線程會直接退出, 而其資源不會釋放.

pthread_join

  • pthread_join()即是子線程合入主線程,主線程阻塞等待子線程結束,然後回收子線程資源。
  • int pthread_join(pthread_t thread, void **retval);
  • pthread_join()函數,以阻塞的方式等待thread指定的線程結束。當函數返回時,被等待線程的資源被收回。如果線程已經結束,那麼該函數會立即返回。並且thread指定的線程必須是joinable的。
  • 返回值 : 0代表成功。 失敗,返回的則是錯誤號。
void *thread_function(void *arg)
{
  int i;
  for ( i=0; i<8; i++)
 {
    printf("Thread working...! %d \n",i);
    sleep(1);
  }
  return NULL;
}
 
int main(void)
{
  pthread_t mythread;
 
  if ( pthread_create( &mythread, NULL, thread_function, NULL) )
 {
    printf("error creating thread.");
    abort();
  }
  if ( pthread_join ( mythread, NULL ) )
 {
    printf("error join thread.");
    abort();
  }
 
  printf("thread done! \n");
  exit(0);
}

pthread_detach

  • pthread_detach()即主線程與子線程分離,子線程結束後,資源自動回收。
  • int pthread_detach(pthread_t tid);
  • pthread_join()函數的替代函數,可回收創建時detachstate屬性設置爲PTHREAD_CREATE_JOINABLE的線程的存儲空間。該函數不會阻塞父線程。pthread_join()函數用於只是應用程序在線程tid終止時回收其存儲空間。如果tid尚未終止,pthread_detach()不會終止該線程。當然pthread_detach(pthread_self())也是可以的. 也就是說phtread_detach()會在該線程結束後, 由操作系統回收資源,而不阻塞主線程.
  • pthread_detach不像pthread_join那樣能保存終止狀態 , 因爲它退出後資源立即自動回收,無法獲取終止狀態!
  • 返回值:pthread_detach() 在調用成功完成之後返回零。其他任何返回值都表示出現了錯誤。如果檢測到以下任一情況,pthread_detach()將失敗並返回相應的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章