下一節傳送門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等待子線程退出。