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