1. 程式人生 > >01—執行緒基本API詳解

01—執行緒基本API詳解

一、程序ID和執行緒ID

(1)程序ID(pid_t):程序在系統中唯一的標識。getpid();

   

(2)執行緒ID(pthread_t):執行緒所屬程序中,執行緒的唯一標識。它只在所屬程序有效。pthread_self(); ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、執行緒相關API

(1)建立執行緒:     #include <pthread.h>     int pthread_create(pthread_t *thread, const pthread_attr_t *attr,                     void *(*start_routine) (void *), void *arg);                      (2)函式引數:      thread : 指向pthread_t型別的指標,該地址將存放執行緒建立成功之後的執行緒ID。      attr   : 執行緒的屬性,一般不需要特殊的設定,所以一般簡單的置空NULL,使用預設屬性。      start_routine : 函式指標,執行緒執行的函式      arg    : 傳遞給執行緒執行函式的引數

(3)返回值:     成功 0     失敗 出錯碼

(4)注意:     pthread_create 僅僅只是建立執行緒,至於執行緒何時執行取決於作業系統的排程。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(1)終止執行緒:     #include <pthread.h>     void pthread_exit(void *retval);   

(2)函式引數:     retval : 執行緒的返回值(執行緒的退出狀態),可以通過pthread_join函式回收 (3)注意:     retval 絕不能用它返回一個指向區域性變數的指標,因為執行緒呼叫該函式後,這個區域性變數就不存在了,這將引起嚴重的程式漏洞。

    pthread_exit()相當於程序的exit();(執行緒中使用exit會結束整個程序,所有執行緒也會結束)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(1)等待執行緒終止:      #include <pthread.h>     int pthread_join(pthread_t thread, void **retval);  (2)函式引數:     thread : 等待執行緒的執行緒id     retval : 不為NULL時,用於接收被等待的執行緒的返回值

一般此函式用在主執行緒中,等待通過thread指定的執行緒終止,此函式呼叫成功,可以通過value_ptr獲取終止執行緒的返回值。

(3)注意:

    如果等待的執行緒沒有終止,此函式將引起呼叫者阻塞。如果等待的執行緒已終止,則立即返回。

(4)返回值:     成功 0     失敗 返回錯誤碼 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(1)取消執行緒:     #include <pthread.h>

    int pthread_cancel(pthread_t thread); (2)函式引數:     thread 要取消的執行緒的 ID

(3)返回值:     成功 0     失敗 返回非0的數字

(4)注意:     執行緒通過呼叫pthread_cancel來請求取消同一個程序中正在執行的其他執行緒。     如果一個執行緒被取消,那pthread_join接受的執行緒返回值為

    PTHREAD_CANCELED(#define PTHREAD_CANCELED ((void *) -1));     pthread_cancel並不等待執行緒終止,僅提出請求,執行緒可以選擇忽略取消或控制如何被取消。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------三、總結整理 在不終止整個程序的情況下,可以有三種方式停止執行緒的工作流並退出。 (1)執行緒從其工作函式中返回,返回值是執行緒的退出碼。 return  (2)執行緒可以被同一程序的其他執行緒取消。 (3)執行緒自己呼叫pthread_exit