詳細介紹執行緒的基本概念、屬性

Mikoto_10032發表於2020-12-16

執行緒的基本概念

​ 1、執行緒就是程式的執行路線,是程式內部的控制元件序列(是程式的一部分)。

​ 2、程式系統中的資源單位,而執行緒是程式的執行單位,程式中至少有一個執行緒叫主執行緒。

​ 3、執行緒是輕量級的,沒有自己獨立的記憶體資源,如:程式碼段、全域性資料段、靜態資料段、堆區、命令列引數、檔案描述符、訊號處理函式等。

​ 4、執行緒唯一擁有的獨立資源是棧記憶體,也就是執行緒有自己獨立的區域性變數、執行緒ID。

​ 5、程式中可以同時擁有多個執行緒,也就是多個執行路線,其中一個是主執行緒,程式中的所有執行緒都在同一個地址空間中活動。

​ 6、當處理複雜任務時可以使用多程式,也可以使用多執行緒,而多執行緒的優點是系統開銷小,任務切換快。

​ 7、而且同一個程式中的執行緒共享所有資源(不包括棧記憶體),所以也就不需要交換資料(不需要類似於IPC的特殊通訊機制),因此執行緒簡單而高效。

​ 8、使用命令:PS -T -p PID 可以檢視程式中各執行緒的資訊,或者使用htop。

​ 9、協程:是程式語言利用執行緒包裝出來的,比執行緒更輕量級的執行單位。

POSIX執行緒

​ UNIX系統早期是沒有執行緒概念的,後期Windows系統是首先使用執行緒的,後面UNIX和Linux才加入執行緒,執行緒的介面是由POSIX制定的,叫pthread。

​ 使用時需要包含pthread.h標頭檔案,編譯時需要新增-pthread引數

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,失敗返回錯誤碼
    
pthread_t pthread_self(void);
功能:獲取執行緒ID

int pthread_equal(pthread_t t1, pthread_t t2);
功能:用於比較兩執行緒ID是否相等
注意:有些作業系統的執行緒ID是以結構體形式實現的,因此不能直接使用==比較
    
int pthread_join(pthread_t thread, void **retval);
功能:等待指定的執行緒結束,並獲取執行緒的結束返回值
thread:要等待的執行緒,如果子執行緒沒有結束,當前執行緒會阻塞
retval:是一個二級指標,用於儲存執行緒入口函式的返回值
    
注意:預設情況下主執行緒結束子執行緒會一起結束。

從執行緒入口函式中獲取返回值要注意的

​ 1、返回的地址要線上程結束後依然有效,因此不能返回棧記憶體的地址。

​ 2、如果返回堆記憶體地址,那麼join函式獲取到改地址並使用完之後,要負責釋放。

​ 3、如果入口函式沒有返回資料,可以返回NULL,join函式如果不想接收入口函式的返回值,retval也可以為NULL。

void pthread_exit(void *retval);
功能:終止執行緒,與入口函式的return功能一樣。
注意:任何執行緒中呼叫exit系列函式,整個程式都將終止。

當CPU的核心的數量不多的情況下,單執行緒效率會比多執行緒效率更高。

int pthread_cancel(pthread_t thread);
功能:向指定的執行緒發出取消操作,預設情況下指定的執行緒會響應取消操作(結束)
    
int pthread_setcancelstate(int state, int *oldstate);
功能:設定執行緒的可取消狀態
state:
	PTHREAD_CANCEL_ENABLE	設定當前執行緒響應取消操作
	PTHREAD_CANCEL_DISABLE	設定當前執行緒不響應取消操作
oldstate:
    輸出引數,獲取執行緒的可取消狀態,不需要則寫NULL
    
int pthread_setcanceltype(int type, int *oldtype);
功能:設定執行緒的取消型別
type:
    PTHREAD_CANCEL_DEFERRED			延遲取消,執行到取消點時才響應。
    PTHREAD_CANCEL_ASYNCHRONOUS		立即取消
oldtype:
    輸出型引數,獲取當前執行緒的取消型別,不需要則寫NULL

int pthread_detach(pthread_t thread);
功能:讓指定的執行緒與建立者分離,執行緒自己會自動回收資源,不會被pthread_join等待

執行緒屬性

 typedef struct
 {
     int						detachstate;		//執行緒的分離狀態
     	PTHREAD_CANCEL_DEFERRED 延遲取消,執行到取消點時才響應。
        PTHREAD_CANCEL_ASYNCHRONOUS 立即取消
     int						schedpolicy;		//執行緒排程策略
     	SCHED_FIFO 	先進先出
   		 	一個FIFO會持續執行,直到執行緒阻塞、結束、有更高優先順序的執行緒就緒
		SCHED_RR	輪轉策略
    		給每個執行緒分配執行時間(時間片),當一個執行緒的時間片耗盡時,下一個執行緒執行
		SCHED_OTHER	普通策略,按照優先順序排程
     struct sched_param			schedparam;			//執行緒的排程引數
     	執行緒的優先順序
     int						inheritsched;		//執行緒的繼承性
     	PTHREAD_INHERIT_SCHED 排程策略繼承建立者的
        PTHREAD_EXPLICIT_SCHED 排程策略由schedpolicy,schedparam決定
     int						scope;				//執行緒的作用域(競爭範圍)
     	PTHREAD_SCOPE_SYSTEM 在系統範圍內競爭資源
        PTHREAD_SCOPE_PROCESS 在程式範圍內競爭資源
     size_t						guardsize;			//執行緒棧末尾的警戒緩衝區大小
     int						stackaddr_set;		//執行緒的棧設定
     void *                     stackaddr;			//執行緒棧的位置
     size_t						stacksize;			//執行緒棧的大小
 }pthread_attr_t;

int pthread_attr_init(pthread_attr_t *attr);
功能:初始化執行緒的屬性結構體
    
int pthread_attr_destroy(pthread_attr_t *attr);    
功能:銷燬執行緒的屬性結構體  
    
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
功能:設定/獲取執行緒的分離狀態

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
功能:設定/獲取棧記憶體的警戒區大小

int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);
int pthread_attr_getinheritsched(pthread_attr_t *attr,int *inheritsched);
功能:設定/獲取執行緒的繼承性
    
int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr,struct sched_param *param);
功能:設定/獲取執行緒的排程引數

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
功能:設定/獲取執行緒的排程策略

int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
功能:設定/獲取執行緒的作用域

int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr, size_t *stacksize);
功能:設定/獲取棧記憶體的位置和大小

int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);
功能:設定/獲取棧記憶體的位置

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
功能:設定/獲取棧記憶體的大小

相關文章