詳細介紹執行緒的基本概念、屬性
執行緒的基本概念
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);
功能:設定/獲取棧記憶體的大小
相關文章
- Java 執行緒池詳細介紹Java執行緒
- javascript屬性描述符詳細介紹JavaScript
- A和Link的rel屬性的詳細介紹
- 多執行緒詳解(1)——執行緒基本概念執行緒
- 詳細介紹C++多執行緒獲取返回值的方法C++執行緒
- C#多執行緒之旅(1):介紹和基本概念C#執行緒
- 執行緒池介紹執行緒
- IOS執行緒介紹iOS執行緒
- 理解索引:MySQL執行計劃詳細介紹索引MySql
- 執行緒屬性設定執行緒
- 多執行緒系列(十七) -執行緒組介紹執行緒
- 程式、執行緒詳細梳理執行緒
- android 自定義控制元件 自定義屬性詳細介紹Android控制元件
- iOS 多執行緒介紹iOS執行緒
- 執行緒的基本概念執行緒
- 執行緒基本概念執行緒
- java多執行緒(超詳細!)Java執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- Java 併發和多執行緒(一) Java併發性和多執行緒介紹[轉]Java執行緒
- 執行緒池的基本概念執行緒
- 執行緒併發執行緒安全介紹及java.util.concurrent包下類介紹執行緒Java
- Rust 屬性介紹Rust
- ClipDrawable屬性介紹
- MySQL Replication的複製執行緒介紹MySql執行緒
- c# 執行緒Thread的IsBackground屬性C#執行緒thread
- 多執行緒基本概念執行緒
- Android執行緒池使用介紹Android執行緒
- 執行緒介紹及建立方式執行緒
- javascript this詳細介紹JavaScript
- JDBC 詳細介紹JDBC
- Kafka詳細介紹Kafka
- Git詳細介紹Git
- 執行緒本地ThreadLocal的介紹與使用!執行緒thread
- Java多執行緒之synchronized的小介紹Java執行緒synchronized
- smartctl 屬性資訊介紹
- Http Module 的詳細介紹HTTP
- asmcmd工具的詳細介紹ASM
- Mysqldump工具的詳細介紹MySql