linux下線程以及pthread庫


一.概述

linux中不區分進程和線程,都認為是個任務,都是創建一個task_struct.如何區分?線程是共享相同地址空間,而進程是獨占地址空間.

多線程共享同一進程的地址空間

優點:

通信方便,可以通過全局變量.

缺點:

訪問共享數據時需要考慮同步和互斥.

 

二.線程共享資源:

可執行的指令

靜態數據

進程中打開的文件描述符

當前工作目錄

用戶ID

用戶組ID

 

三.線程私有資源:

線程ID

PC(程序計數器)和相關寄存器:保證不同線程執行不同的代碼.

堆棧

錯誤號

優先級

執行狀態和屬性

 

四.Linux線程庫:

pthread線程庫:(POSIX)

1.創建線程:

2.回收線程(pthread_join):

pthread_join(pthread_t thread, void **retval)

*retval接收線程thread函數對應的返回值,比如return返回的值或者pthread_exit中的retval.(兩者是等效的)

3.結束線程(pthread_exit):

結束當前線程,而exit是結束當前的進程.

pthread_exit(void *retval)相當於return retval;可以是各種類型.

retval可被其他線程通過pthread_join獲取.

示例:

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

void * task(void * param)
{
    sleep(5);
    printf("hello\n");
    //pthread_exit(NULL);
    //pthread_exit("子線程執行完畢"); //既可以返回NULL,也可以返回字符串.
    return "子線程執行完畢";
}

int main()
{
    //初始化線程
    pthread_t tid;
void *result;

    //創建線程
    int rc = pthread_create(&tid, NULL, task, NULL);

    if(rc)
    {
        printf("線程創建失敗!\n");
        return -1;
    }
    pthread_join(tid, &result);
    printf("創建主線程\n");
    printf("result is %s\n", result);
    pthread_exit(NULL);  //退出,並返回NULL,有個就不需要return 0了.
}


免責聲明!

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



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