pthread庫的使用


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 是線程的退出碼,傳遞給創建線程的地方

說明:

一個線程的結束有兩種途徑:

  1. 線程函數體執行結束;
  2. 調用 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);

線程屬性包括:

  1. 作用域;
  2. 棧大小;
  3. 棧地址;
  4. 優先級;
  5. 分離狀態;
  6. 調度策略;
  7. 調度參數;

線程屬性暫時不做深入研究

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_DETACHEDPTHREAD_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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM