日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++线程基本函数

發布時間:2024/2/28 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_SYSTEMPTHREAD_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++线程基本函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。