C/C++线程基本函数
目錄
創建線程和結束線程
線程屬性
?
創建線程和結束線程
(1)線程創建函數
int?pthread_create?( pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);功能:創建一個具有指定參數的線程。
形參:thread是要創建的線程的線程ID指針。
pthread_t類型的定義是?typedef unsigned long int pthread_t;?(打印時要使用%lu或%u方式)。
attr:創建線程時的線程屬性(設置NULL表示使用默認線程屬性)。
start_routine:指向的是新線程將運行的函數。線程一旦被創建好,內核就可以調度內核線程來執行start_routine函數指針所指向的函數了。
arg:指向的是運行函數的形參。
返回值:若是成功建立線程返回0,否則返回錯誤的編號。
?
(2)等待線程結束函數
int?pthread_join(pthread_t thread, void **retval);功能:這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。
形參:thread是被等待的線程標識符。
retval:一個用戶定義的指針,它可以用來存儲被等待線程的返回值。
返回值:成功返回0,否則返回錯誤的編號。
錯誤碼:
①EDEADLK:可能引起死鎖,比如兩個線程互相針對對方調用pthread_join,或者線程對自身調用pthread_join。
②EINVAL:目標線程是不可回收的,或者已經有其他線程在回收目標線程。
③ESRCH:目標線程不存在。
?
(3)線程退出函數
void?pthread_exit(void *retval);功能:線程函數在結束時調用此函數,以確保安全、干凈地退出。
形參:retval是函數的返回指針,只要pthread_join中的第二個參數retval不是NULL,這個值將被傳遞給retval。pthread_exit函數通過retval參數向線程的回收者傳遞其退出信息。他執行完之后不會返回到調用者,而且永遠不會失敗。
?
(4)線程取消函數
int?pthread_cancel(pthread_t thread);功能:取消某個線程的執行。
形參:thread是要取消線程的標識符ID。
返回值:若是成功返回0,否則返回錯誤的編號。
但是,接收到取消請求的目標線程可以決定是否允許被取消以及如何取消,這分別由如下兩個函數完成。
?
int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldtype);這兩個函數的第一個參數分別用于設置線程的取消狀態(是否允許取消)和取消類型(如何取消),第二個參數則分別記錄線程原來的取消狀態和取消類型。
state參數有兩個可選值:
PTHREAD_CANCEL_CNABLE,允許線程被取消。它是線程被創建時的默認取消狀態。
PTHREAD_CANCEL_DISABLE,禁止線程被取消。這種情況下,如果一個線程收到取消請求,則它會將請求掛起,直到該線程允許被取消。
type參數也有兩個可選值:
PTHREAD_CANCEL_ASYNCHRONOUS,線程隨時都可以被取消。它將使得接收到取消請求的目標線程立即采取行動。
PTHREAD_CANCEL_DEFERRED,允許目標線程推遲行動,直到它調用了下面幾個所謂的取消點函數中的一個:pthread_join、pthread_testcancel、pthread_cond_wait、pthread_cond_timedwait、sem_wait和sigwait。根據POSIX標準,其他可能阻塞的系統調用,比如read、wait,也可以成為取消點。不過為了安全起見,最好在可能會被取消的代碼中調用pthread_testcancel函數設置取消點。
?
(5)獲取當前線程ID函數
pthread_t?pthread_self?(void);功能:獲取當前調用線程的線程ID。
返回值:當前線程的線程ID標識。
?
(6)分離釋放線程函數
int?pthread_detach?(pthread_t thread);功能:允許分離執行線程,即獨立的執行。同時也是線程資源釋放方式設置函數,一旦線程退出,則釋放分配的資源。
形參:thread是要釋放線程的標識符ID。
返回值:若是成功返回0,否則返回錯誤的編號。
其他說明:linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態。一個線程默認的狀態是joinable,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時,都不會釋放線程所占用堆棧和線程描述符(總計8K多),只有當調用了pthread_join之后這些資源才會被釋放。若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。unjoinable屬性可以在pthread_create時指定,或在線程創建后在線程中pthread_detach自己設置,如:pthread_detach(pthread_self()),將狀態改為unjoinable狀態,確保資源的釋放。如果線程狀態為joinable,需要在之后適時調用pthread_join。
?
(7)比較兩個線程是否為同一線程
int?pthread_equal?(pthread_t thread1, pthread_t thread2);功能:判斷兩個線程ID是否是同一個。
形參:thread1是要比較的線程的標識符ID1;thread2是要比較的線程的標識符ID2。
返回值:不相等返回0,相等非零。
?
(8)創建線程私有數據
int?pthread_key_create?(pthread_key_t *key, void (*destr_function) (void *));功能:創建線程私有數據TSD,提供線程私有的全局變量。使用同名而不同內存地址的線程私有數據結構。
形參:Key是線程私有數據。
第二個參數:如果第二個參數不為空,在線程退出時將以key所關聯數據為參數調用其指向的資源釋放函數,以釋放分配的緩沖區。
其他說明:不論哪個線程調用pthread_key_create()函數,所創建的key都是所有線程可訪問的,但各個線程可根據自己的需要往key中填入不同的值 相當于提供了同名不同值的全局變量,各線程對自己私有數據操作互相不影響。
?
注銷線程私有數據
int?pthread_key_delete?(pthread_key_t *key);該函數并不檢查當前是否有線程正是用該TSD,也不會調用清理函數(destr_function) 將TSD釋放以供下一次調用pthread_key_create()使用。
?
(9)讀寫線程私有數據
int?pthread_setspecific?(pthread_key_t key, const void *pointer);?//寫 void?pthread_getspecific?(pthread_key_t key); //讀函數pthread_setspecific()將pointer的值(非內容)與key相關聯。函數pthread_getspecific()將與key相關聯的數據讀出來。所有數據都設置為void *,因此可以指向任何類型的數據。
?
線程屬性
(1)初始化線程對象屬性
int?pthread_attr_init?(pthread_attr_t *attr);功能:pthread_attr_init實現時為屬性對象分配了動態內存空間。
形參:attr是指向一個線程屬性的指針。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(2)銷毀線程對象屬性
int?pthread_attr_destroy?(pthread_attr_t *attr);功能:經pthread_attr_destroy去除初始化之后的pthread_attr_t結構被pthread_create函數調用,將會導致其返回錯誤。只有再次初始化后才能繼續使用。
形參:attr是指向一個線程屬性的指針。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(3)獲取線程分離狀態屬性
int?pthread_attr_getdetachstate?(pthread_attr_t *attr, int *detachstate);功能:獲取線程分離狀態屬性;另外,pthread_detach()是分離釋放線程資源函數
形參:attr是指向一個線程屬性的指針。
detachstate:保存返回的分離狀態屬性。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(4)修改線程分離狀態屬性
int?pthread_attr_setdetachstate?(pthread_attr_t *attr, int detachstate);功能:修改線程分離狀態屬性。
形參:attr是指向一個線程屬性的指針。
detachstate:其含義是線程的脫離狀態,它有兩個可選值,分別是PTHREAD_CREATE_JOINABLE(可連接)以及PTHREAD_CREATE_DETACHED(分離)。前者指定線程是可以被回收的,后者使調用線程脫離與進程中其他線程同步。脫離了與其他線程同步的線程成為”脫離線程”。脫離線程在退出時將自行釋放其占用的系統資源。線程創建時該屬性的默認值是PTHREAD_CREATE_JOINABL。此外,我們可以使用pthread_detach函數直接將線程設置為脫離線程。(上述detachstate的含義相同,之后相同含義的參數,都只介紹一次)
返回值:若是成功返回0,否則返回錯誤的編號。
?
(5)獲取線程的CPU親緣性
int?pthread_attr_getaffinity_np?(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);功能:獲取線程的CPU親緣屬性。
形參:attr是指向一個線程屬性的指針。
cpusetsize:指向CPU組的緩沖區大小。
cpuset:指向CPU組的指針。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(6)設置線程的CPU親緣性
int?pthread_attr_setaffinity_np?(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);功能:通過指定cupset來設置線程的CPU親緣性。
形參:attr是指向一個線程屬性的指針。
cpusetsize:指向CPU組的緩沖區大小。
cpuset:指向CPU組的指針。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(7)獲取線程的作用域
int?pthread_attr_getscope?(const pthread_attr_t *attr, int *scope);功能:指定了作用域也就指定了線程與誰競爭資源。
形參:attr是指向一個線程屬性的指針;scope是返回線程的作用域。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(8)設置線程的作用域
int?pthread_attr_setscope?(pthread_attr_t *attr, int scope);功能:指定了作用域也就指定了線程與誰競爭資源
形參:attr是指向一個線程屬性的指針。
scope:線程間競爭CPU的范圍,即線程優先級的有效范圍。POSIX標準定義了該屬性可以取以下兩個值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示目標線程與系統中所有線程一起競爭CPU的使用,后者表示目標線程僅與其他隸屬于同一進程的線程競爭CPU的使用。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(9)獲取線程的棧保護區大小
int?pthread_attr_getguardsize?(const pthread_attr_t *attr, size_t *guardsize);功能:獲取線程的棧保護區大小。
形參:attr是指向一個線程屬性的指針。
guardsize:返回獲取的棧保護區大小。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(10)設置線程的棧保護區大小
int?pthread_attr_setguardsize?(pthread_attr_t *attr, size_t *guardsize);功能:參數提供了對棧指針溢出的保護。默認為系統頁大小。
形參:attr是指向一個線程屬性的指針。
guardsize:線程的棧保護區大小。如果guardsize大于0,則系統創建線程的時候會在其堆棧的尾部額外分配guardsize字節的空間,作為保護堆棧不被錯誤地覆蓋的區域。如果guardsize等于0,則系統不為新創建的線程設置堆棧保護區。如果使用者通過pthread_attr_setstack()或pthread_attr_setstackaddr()函數手動設置線程的堆棧,則guardsize屬性將被忽略。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(11)獲取線程的堆棧信息(棧地址和棧大小)
int?pthread_attr_getstack?(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);功能:獲取線程的堆棧地址和大小。
形參:attr是指向一個線程屬性的指針。
stackaddr:返回獲取的棧地址。
stacksize:返回獲取的棧大小。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(12)設置線程的堆棧區
int?pthread_attr_setstack?(pthread_attr_t *attr, void *stackaddr, size_t stacksize);功能:設置堆棧區,將導致pthread_attr_setguardsize失效。
形參:attr是指向一個線程屬性的指針。
stackaddr:線程的堆棧地址,應該是可移植的,對齊頁邊距的,可以用posix_memalign來進行獲取。
stacksize:線程的堆棧大小,應該是頁大小的整數倍。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(13)獲取線程堆棧地址
int?pthread_attr_getstackaddr?(const pthread_attr_t *attr, void **stackaddr);功能:一般用pthread_attr_getstack來代替。
形參:attr是指向一個線程屬性的指針;stackaddr是返回獲取的棧地址。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(14)設置線程堆棧地址
int?pthread_attr_setstackaddr?(pthread_attr_t *attr, void *stackaddr);功能:一般用pthread_attr_setstack來代替。
形參:attr是指向一個線程屬性的指針;stackaddr是設置線程堆棧地址。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(15)獲取線程堆棧大小
int?pthread_attr_getstacksize?(const pthread_attr_t *attr, size_t *stacksize);功能:獲取線程堆棧大小。
形參:attr是指向一個線程屬性的指針;stacksize是返回線程的堆棧大小。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(16)設置線程堆棧大小
int?pthread_attr_setstacksize?(pthread_attr_t *attr, size_t stacksize);功能:設置線程堆棧大小。
形參:attr是指向一個線程屬性的指針。
stacksize:設置線程的堆棧大小,stack屬性的合法值包括PTHREAD_STACK_MIN,該線程的用戶棧大小將使用默認堆棧大小,為某個線程所需最小堆棧大小,但對于所有線程,這個大小可能無法接受,具體指定的大小,即使用線程的用戶堆棧大小的數值,必須不小于最小堆棧大小PTHREAD_STACK_MIN。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(17)獲取線程的調度策略
int?pthread_attr_getschedpolicy?(const pthread_attr_t *attr, int *policy);功能:獲取線程的調度策略。
形參:attr是指向一個線程屬性的指針;policy是返回線程的調度策略。
返回值:若是成功返回0,否則返回錯誤的編號。
按照如下方法使用sched_get_priority_max()和sched_get_priority_min(),可以得到優先級的最大值和最小值。?
頭文件:#include <pthread.h> #include <sched.h>
調用形式:
#include <sched.h> int?sched_get_priority_max(int?policy); int?sched_get_priority_min(int?policy);?
(18)設置線程的調度策略
int?pthread_attr_setschedpolicy?(pthread_attr_t *attr, int policy);頭文件:#include <pthread.h> #include <sched.h>
功能:設置線程的調度策略。
形參:attr是指向一個線程屬性的指針。
policy:線程的調度策略,POSIX指定了3種調度策略屬性:SCHED_FIFO表示先入先出策略,SCHED_RR表示輪轉調度(這兩種調度方法都具備實時調度功能,但只能用于以超級用戶身份運行的進程),SCHED_OTHER是系統默認策略,SCHED_OTHER是不支持優先級使用的。SCHED_FIFO和SCHED_RR支持優先級的使用,它們分別為1和99,數值越大優先級越高。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(19)獲取線程的調度參數
int?pthread_attr_getschedparam?(const pthread_attr_t *attr, struct sched_param *param);頭文件:#include <pthread.h> #include <sched.h>
功能:獲取線程的調度參數。
形參:attr是指向一個線程屬性的指針;param是返回獲取的調度參數。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(20)設置線程的調度參數
int?pthread_attr_setschedparam?(pthread_attr_t *attr, const struct sched_param *param);頭文件:#include <pthread.h> #include <sched.h>
功能:設置線程的調度參數,用于設置優先級。
形參:attr是指向一個線程屬性的指針。
param:要設置的調度參數,其類型是sched_param結構體。至少需要定義這個數據成員
struct sched_param { int sched_priority; /*該成員表示線程運行優先級*/ };sched_param可能還有其他的數據成員,以及多個用來返回和設置最小優先級、最大優先級、調度器、參數等的函數。如果調度策略是SCHED_FIFO或SCHED_RR,那么要求具有值的唯一成員是sched_priority。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(21)獲取線程是否繼承調度屬性
int?pthread_attr_getinheritsched?(const pthread_attr_t *attr, int *inheritsched);頭文件:#include <pthread.h> #include <sched.h>
功能:獲取線程是否繼承調度屬性。
形參:attr是指向一個線程屬性的指針;inheritsched是返回繼承調度屬性的設置。
返回值:若是成功返回0,否則返回錯誤的編號。
?
(22)設置線程繼承調度屬性
int?pthread_attr_setinheritsched?(pthread_attr_t *attr, int inheritsched);頭文件:#include <pthread.h> #include <sched.h>
功能:設置線程是否繼承調度屬性。
形參:attr是指向一個線程屬性的指針。
Inheritsched:設置線程是否繼承調用線程的調度屬性,可能取值如下:
PTHREAD_INHERIT_SCHED表示新線程沿用其創建者的線程調度參數,這種情況下再設置新線程的調度參數屬性將沒有任何效果。PTHREAD_EXPLICIT_SCHED表示調用者要明確地指定新線程的調度參數。
返回值:若是成功返回0,否則返回錯誤的編號。
總結
以上是生活随笔為你收集整理的C/C++线程基本函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存四区 malloc/free与ne
- 下一篇: 自旋锁、互斥锁和信号量