定義
輕量級進程,實現多任務并發,是操作系統任務調度最小單位(進程是資源分配最小單位 )。
創建
由進程創建,屬于進程內執行單元。
- 獨立:線程有8M 獨立棧區 。
- 共享:與所屬進程及進程內其他線程,共享堆區、數據區、文本區(代碼、全局變量等共享 )。
進程是操作系統資源分配最小單位
線程是操作系統任務調度的最小單位
調度
宏觀并行(多線程看似同時執行 )、微觀串行(CPU 單核時,線程交替占用 CPU ,實際串行執行 )。
消亡
1.?線程退出(主動結束任務邏輯 )。
2.?回收線程資源(棧區等,需避免內存泄漏 )。
進程與線程的區別
相關編程
創建
pthread_create
#include <pthread.h>
int pthread_create(
pthread_t *thread, ? ? ? ?// 存儲新線程ID的變量地址
const pthread_attr_t *attr, // 線程屬性(傳NULL用默認屬性)
void *(*start_routine)(void *), // 線程執行函數(函數指針)
void *arg ? ? ? ? ? ? ? ? // 傳給線程函數的參數
);
功能
創建新線程,與進程內其他線程并發執行。
參數
thread?:成功創建后,線程 ID 存入該地址。
attr?:控制線程屬性(如棧大小、優先級),一般傳 ?NULL??用默認配置。
start_routine?:線程啟動后執行的函數(需符合 ?void* func(void*)??格式 )。
arg?:傳給線程函數的參數(需強制類型轉換時,用 ?(void*)??處理 )。
返回值
成功返回 0 ,失敗返回非 0 錯誤碼。
線程標識
pthread_self?
pthread_t pthread_self(void);
功能
獲取當前線程的 ID,用于線程身份識別(如打印、判斷 )。
線程退出
pthread_exit
void pthread_exit(void *retval);
功能
主動終止當前線程, retval ?是線程退出返回值(可被 pthread_join ?捕獲 )。
注意:主線程調用會直接退出,子線程調用僅終止自身。
線程回收
pthread_join
int pthread_join(pthread_t thread, void **retval);
功能
阻塞等待指定線程結束,回收其資源,類似進程的 wait 。
參數
- ?thread?:要回收的線程 ID。
- ?retval?:存儲線程退出返回值(?pthread_exit??的參數 ),傳 ?NULL??則不捕獲。
返回值
成功 0 ,失敗非 0。
線程回收策略
(一)分離屬性線程
- 特點:無需其他線程回收,由操作系統自動回收資源。
- 適用場景:線程結束后無需通知父線程,或無空閑線程協助回收時(如后臺守護線程 )。
(二)非分離屬性線程
- 特點:需通過 ?pthread_join??阻塞回收,父線程調用后等待線程結束,釋放資源。
- 適用場景:需同步等待線程結果,或需捕獲線程退出狀態時。
線程屬性(核心:分離屬性 )
(一)分離屬性定義
- 線程無需被其他線程回收,結束后由操作系統自動清理資源。
- 函數:?int pthread_detach(pthread_t thread);?
- 功能:將指定線程設置為分離屬性。
- 參數:?thread??為目標線程 ID。
- 返回:成功 ?0?,失敗非 ?0?。
(二)非分離屬性(默認)
- 線程需被其他線程(如創建者)通過 ?pthread_join??回收,否則可能成為“僵尸線程”。
- 默認行為:線程創建后默認是非分離屬性,需主動處理回收。
線程之間通信與互斥
全局變量通信
利用線程共享進程全局變量、堆區數據的特性,直接讀寫全局變量實現通信。
臨界資源
多個線程可同時訪問的資源,如:
- 全局變量、共享內存、文件描述符等。
資源競爭
多線程并發訪問臨界資源時,操作順序不確定,可能導致數據混亂(如計數錯誤、數據不完整 )。
互斥機制
通過互斥鎖(Mutex) 實現排他性訪問:同一時間僅允許一個線程訪問臨界資源。
實現步驟
1. 定義鎖 ?pthread_mutex_t mutex;??聲明互斥鎖變量?
2. 初始化 ?pthread_mutex_init(&mutex, NULL);??初始化鎖(?NULL??用默認屬性)?
3. 加鎖 ?pthread_mutex_lock(&mutex);??阻塞加鎖,確保臨界區獨占訪問?
4. 訪問資源 讀寫臨界資源(如全局變量) 臨界區操作?
5. 解鎖 ?pthread_mutex_unlock(&mutex);??釋放鎖,允許其他線程訪問?
6. 銷毀鎖 ?pthread_mutex_destroy(&mutex);??釋放鎖資源(不再使用時調用)?
pthread_mutex_init
int pthread_mutex_init(
pthread_mutex_t *restrict mutex,?
const pthread_mutexattr_t *restrict attr
);
功能
初始化互斥鎖。
參數
- ?mutex?:鎖對象地址(需提前聲明 ?pthread_mutex_t??變量 )。
- ?attr?:鎖屬性(傳 ?NULL??用默認屬性 )。
返回值
成功 0 ,失敗 -1 。