1. 程式人生 > >執行緒的建立、終止、等待和分離

執行緒的建立、終止、等待和分離

1、執行緒建立
int pthread_create(pthread_t thread,const pthread_attr_t *attr,void (start_routine) (void ),void *arg);
引數:

  • thread:返回執行緒ID(使用者態)
  • attr:設定執行緒屬性,不易設為NULL;
  • start_routine:是一個函式地址,執行緒啟動時要執行的函式
  • arg:傳給執行緒啟動函式的引數

返回值:成功返回0;失敗返回錯誤編碼。
功能:建立一個執行緒,並且將執行緒加入當前程序

2、執行緒終止的三種方法:

  • 從執行緒函式 return,這種方法對於主程序不適用,從main函式return相當於呼叫exit
  • 一個執行緒可以呼叫pthread_cancel終止同一個程序中的一個執行緒。
  • 執行緒可以自己呼叫pthread_exit()終止自己,哪個執行緒呼叫,哪個執行緒的終止。

我們使用的是pthread_wait()來終止一個執行緒
void pthread_exit(void *value_ptr)

  • 功能:使用函式退出執行緒,這是執行緒的主動行為
  • 引數:value_ptr:value_ptr不要指向一個區域性變數,用來儲存執行緒退出以後的返回值。這個返回值很少使用。
  • 返回值:無返回值,和程序一樣,執行緒結束時無法返回到他的呼叫者。

取消一個執行緒
int pthread_cancel(pthread_t thread);

  • 概念:ptthread_canel呼叫並不等待執行緒的終止,他只是提出請求,執行緒提出請求後會繼續執行,直到達到取消點
  • 引數,執行緒ID;
  • 返回值:成功返回0,失敗返回錯誤碼

3、執行緒等待(等待狀態,和pthread_detach()相對應)
一個執行緒創建出來的預設屬性是joinable。
int pthread_join(pthread_t thread, void **retval)

  • 以阻塞的方式等待thread指定的執行緒結束,當函式返回時 ,被等待執行緒的資源將會被回收 ,如果執行緒已經結束,那麼該函式會立即返回,並且thread指定的執行緒必須是joinable的。
  • 引數:thread:執行緒識別符號,即執行緒 ID; retval:使用者定義的指標,用來儲存被等待執行緒的返回值。
  • 返回值:0代表成功,否則表示失敗,,返回的是錯誤碼。
  • 應用:程式碼中如果沒有pthread_join主執行緒會很快結束,從而使整個程序結束,從而使建立的執行緒沒有機會執行就結束了,加入pthread_join後,主執行緒會一直等待直到等待的執行緒結束才會自己結束,使建立的執行緒有機會執行。
  • 目的,為了獲取執行緒的退出狀態

由於一個程序的多個執行緒是共享資料段的,因此通常線上程退出的情況下,退出程序所佔的資源並不會隨著執行緒的終止而得到釋放。所以可以通過pthread_join()來同步釋放資源。

4、返回執行緒的id
pthread_t pthread_self(void)
返回值:誰呼叫這個函式,返回誰的執行緒ID

5、執行緒分離
執行緒分離(不可等待狀態):
pthread_detach()和pthread_join()不可以同時使用
int pthread_detach(pthread_t thread);

  • 功能:分離執行緒,指定執行緒退出後自動釋放資源,設定執行緒的分離屬性(將等待屬性變為分離屬性),即將jionable屬性改為分離屬性,不關心執行緒的退出狀態。
  • 由來:呼叫pthread_join()後,如果 執行緒沒有執行結束,呼叫者會被阻塞,但是有些情況下我們不希望如此,所以可以在子執行緒中 加入以下程式碼:pthread_detach(pthread_self())

父執行緒呼叫pthread_detach(thread_id)(非阻塞,可立即返回)
將該子執行緒的狀態設定為detached,則該執行緒執行結束後會自動釋放所有資源。