和我一起學 Linux多線程編程(一)

下一節傳送門https://blog.csdn.net/qq_37120369/article/details/101164870

一、首先我們來認識線程

在講線程前我們先提一下進程,進程是系統中程序執行和資源分配的基本單位

線程則是進程內獨立的一條運行路線,是處理器調度的最小單位,也稱輕量級進程,在一個進程中的多個執行路線就叫做線程。

要注意的是,由於線程共享了進程的資源和地址空間,因此,任何線程對系統共享資源的操作都會給其他線程帶來影響,所以線程的同步很重要了

編寫線程程序最主要的是要考慮同步與互斥問題

linux下多線程遵從POSIX接口,編寫時源文件時需要包含頭文件pthread.h,編譯時需要連接庫文件libpthread.a ,

編譯時帶上-lpthread的選項

 

二、linux線程的基本函數

1.    函數pthread_create用於創建一個新線程

參數詳解:

 thread  用來表明創建線程的ID,如果線程創建成功則通過這個指針返回

 attr  指明線程創建時的屬性,NULL表示默認屬性

start_routine   函數指針,指向線程創建成功後開始執行的函數

arg  傳遞給start_routine所指函數的唯一參數

返回值:

成功返回 0;錯誤返回出錯碼

2.    線程的退出

       先介紹一下  線程退出有倆種方式,其一,在線程函數結尾用return或者自行運行完線程函數,線程函數自然結束,這是最常見的方法。其二,通過函數pthread_exit退出線程。

參數詳解:

retval 線程返回值

返回值:

退出當前線程返回retval,父線程或其他線程可以通過pthread_join獲取它

3.     等待線程退出函數

該函數的作用是懸掛當前線程,直到線程編號爲thread(函數參數)的線程被終止結束,類似waitpid函數。

當一個線程調用了pthread_exit函數時,其他線程或進程使用pthread_join等待該線程結束,那麼線程的ID和退出狀態會一直保留到pthread_join執行時。pthread_exit函數設定的返回值(retval)、或者線程函數return的返回值可以被pthread_join函數的參數(thread_return)捕獲。

參數詳解:

thread:被等待的線程ID

thread_return:用戶定義的指針,用來存儲被等待線程返回值

返回值:

成功返回0;錯誤返回-1

參考程序

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <unistd.h>



#define RUN_TIME 5



//定義線程函數

void * thread(void * arg)

{

int i;

int no=(int)arg;

for(i=0;i<RUN_TIME;i++)

{

printf("This is a pthread %d\n",no);

sleep(1);

}

}

int main(void)

{

pthread_t id;

int i,ret;

//創建線程

ret=pthread_create(&id,NULL,(void *) thread,(void *)1);

if(ret!=0){

printf("Create pthread error!\n");

exit(1);

}

for(i=0;i<RUN_TIME;i++)

{

printf("This is the main process.\n");

sleep(1);

}

//等待線程退出

pthread_join(id,NULL);

return (0);

}

編譯及執行過程如下:

 

出現警告時由於在線程函數中對傳進的參數做了強制轉換

 

補充:程序的主進程默認爲主線程。主線程退出(例如main函數裏的exit),它的子線程無論是否執行完成,都會隨着主線程消失而消失。所以,一般在主函數裏必須判斷子線程是否真正退出(否則容易出現程序結果不正確),最常用的方法就是使用pthread_join等待子線程退出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章