1、說明
pthread 是Linux下的線程庫。
2、使用
使用 pthread 需要添加頭文件,並鏈接庫 pthread
#include <pthread.h>
2.1、pthread_create
聲明:
int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void*(*start_routine)(void*), void* arg);
參數:
pthread_t 定義如下:
typedef unsigned long int pthread_t;
thread 是一個指向線程標識符的指針,線程調用后,改值被設置為線程ID
attr 用來設置線程屬性
start_routine 是線程函數的其實地址,即線程函數體,線程創建成功后,thread 指向的內存單元從該地址開始運行
arg 是傳遞給線程函數體的參數
返回值:
若線程創建成功,則返回0,失敗則返回錯誤碼,並且 thread 內容是未定義的。
2.2、pthread_join
聲明:
int pthread_join(pthread_t thread, void **retval);
參數:
thread 是線程表示符
retval 用來獲取線程的返回值,一般是 pthread_join 方法傳遞出來的值
說明:
這是一個線程阻塞函數,調用該函數則等到線程結束才繼續運行
2.3、pthread_exit
聲明:
void pthread_exit(void *retval);
參數:
retval 是線程的退出碼,傳遞給創建線程的地方
說明:
一個線程的結束有兩種途徑:
- 線程函數體執行結束;
- 調用 pthread_exit 方法退出線程;
2.4、pthread_self
用來獲取當前線程ID
聲明:
pthread_t pthread_self();
2.5、pthraad_detach
分離線程
聲明:
int pthread_detach (pthread_t __th)
3、線程屬性
設置線程不同屬相有不同屬性有不同的方法,但是都需要先初始化屬性數據結構,初始化函數為:
int pthread_attr_init(pthread_attr_t *__attr);
線程屬性包括:
- 作用域;
- 棧大小;
- 棧地址;
- 優先級;
- 分離狀態;
- 調度策略;
- 調度參數;
線程屬性暫時不做深入研究
3.1、分離狀態
線程終止時,系統將不再保留線程終止狀態;當不需要線程的終止狀態時,可以分離線程(調用 pthread_detach 函數),也可以通過設置線程的分離狀態實現
int pthread_attr_getdetachstate(const pthread_attr_t* attr, int* state);
int pthread_attr_setdetachstate(pthread_attr_t* attr, int state);
state 的值可以是 PTHREAD_CREATE_DETACHED 和 PTHREAD_CREATE_JOINABLE,分別表示主線程阻塞和子線程剝離
3.2、線程優先級
新線程的優先級默認為0
int pthread_attr_getschedparam(const pthread_attr_t *restrict attr, struct sched_param *restrict param) ;
int pthread_attr_setschedparam(pthread_attr *restrict attr, const struct sched_param* restrict param);
3.3、繼承父優先級
新線程不繼承父線程的調度優先級
3.4、調度策略
線程使用 SCHED_OTHER 調度策略,線程一旦開始運行,直到被強占或者直到線程阻塞或者停止位置
int pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy);
int pthread_attr_setschedparam(pthread_attr_t* attr, struct sched_param* param)
4、代碼示例
#include <iostream>
#include <pthread.h>
#include <unistd.h>
void *thread(void *arg){
printf("thread id: %ld\n", pthread_self());
int value = *(int *)arg;
for (int index = 0; index < value; index++){
printf("thread, arg, %d\n", index);
sleep(1);
}
long res = 9;
pthread_exit((void*)res);
return arg;
}
int main(){
void* res = 0;
int value = 5;
//設置線程屬性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//線程分離
pthread_t handle;
pthread_create(&handle, &attr, thread, &value);
//pthread_create(&handle, NULL, thread, &value);
// pthread_detach(handle);//線程剝離
pthread_join(handle, &res);//join阻塞
printf("------end------,res: %ld\n", (long)res);//線程中傳出的9
return 0;
}