Linux學習 執行緒控制

2021-07-16 08:36:02 字數 3224 閱讀 6470

關於執行緒控制,主要就是幾個模組,我們乙個乙個消滅、消化:

一、執行緒建立:

1.先來看看在linux環境下的執行緒建立函式:

分析:意思很明顯:

1.函式名是 pthread_create  ;

2.功能:就是建立乙個執行緒;

3.函式原型:

#include //標頭檔案

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

4.返回值:

成功返回0,失敗返回錯誤號。以前學過的系統函式都是成功返回0,失敗返回-1,而錯誤 號儲存在全域性變數errno中,而pthread庫的函式都是通過返回值返回錯誤號;

雖然每個執行緒也都有乙個errno,但這是為了相容其它函式介面而提供的,pthread庫本身並不使用它,通過返回值返回錯誤碼更加清晰。

5.引數:第乙個是執行緒id;第二個是 執行緒屬性(結合、分離、大小、執行時棧等);第三個是新執行緒的處理函式;第四個表示新執行緒處理函式的引數;

如下:

執行結果:

2、關於執行緒:

在乙個執行緒中呼叫pthread_create()建立新的執行緒後,當前執行緒從pthread_create()返回繼續往下執行,而新的執行緒所執行的**由我們傳給pthread_create的函式指標

start_routine決 定。 start_routine函式接收乙個引數,是通過pthread_create的arg引數傳遞給它的,該引數的型別為 void *,這個指標按什麼型別解釋由呼叫者自己定義。

start_routine的返回值型別也是void *,這指標的含義同樣由呼叫者自己定義。start_routine返回時,這個執行緒就退出了,其它執行緒 可以呼叫pthread_join得到start_routine的返回值,

類似于父程序呼叫wait(2)得到子程序的退出 狀態。

pthread_create成功返回後,新建立的執行緒的id被填寫到thread引數所指向的記憶體單元。我們知道程序id的型別是pid_t,每個程序的id在整個系統中是唯一的,

呼叫getpid(2)可以獲得當前程序的id,是乙個正整數值。執行緒id的型別是thread_t,它只在當前程序中保證是唯一的,在不同的系 統中thread_t這個型別有不同的實現,

它可能是乙個整數值,也可能是乙個結構體,也可能是乙個位址,所以不能簡單地當成整數用printf列印,呼叫pthread_self(3)可以獲得當前執行緒的id。  attr引數表示執行緒屬性,

所有**例子都傳null給attr引數,表示執行緒屬性取預設值。可知在linux上,pthread_t型別是乙個位址值,屬於同一程序的多個執行緒呼叫getpid(2)可以得到相同的程序號,

而呼叫pthread_self(3)得到的執行緒號各不相同。  

由於pthread_create的錯誤碼不儲存在errno中,因此不能直接用perror(3)列印錯誤資訊,可以先 用strerror(3)把錯誤碼轉換成錯誤資訊再列印。 

二、執行緒終止:

如果需要只終止某個執行緒而不終止整個程序,可以有三種方法: 

1. 從執行緒函式return:這種方法對主線程不適用,從main函式return相當於呼叫exit。 

分析:這個很明白,就不多說,main函式中return也相當,exit();即終止程序;

2. 乙個執行緒可以呼叫pthread_cancel終止同一程序中的另乙個執行緒。 

函式標頭檔案、函式原型:

返回值:

例子:

3. 執行緒可以呼叫pthread_exit終止自己。 

函式原型、標頭檔案、返回值:

retval是void *型別,和執行緒函式返回值的用法一樣,其它執行緒可以呼叫pthread_join獲得這個指 針。 

需要注意,pthread_exit或者return返回的指標所指向的記憶體單元必須是全域性的或者是用 malloc分配的;

三、執行緒等待:

標頭檔案、函式原型:

呼叫該函式的執行緒將掛起等待,直到id為thread的執行緒終止。thread執行緒以不同的方法終止,通過pthread_join得到的終止狀態是不同的,總結如下:

1. 如果thread執行緒通過return返回,value_ptr所指向的單元裡存放的是thread執行緒函式的返回值。  

2. 如果thread執行緒被別的執行緒呼叫pthread_cancel異常終掉,value_ptr所指向的單元裡存放的是常數pthread_canceled。 

3. 如果thread執行緒是自己呼叫pthread_exit終止的,value_ptr所指向的單元存放的是傳給 pthread_exit的引數。 

如果對thread執行緒的終止狀態不感興趣,可以傳null給value_ptr 引數。  

返回值:成功返回零,失敗返回錯誤號:

以下為上邊三種執行緒控制的完整測試**:

#include#include#includevoid *thread_run(void *str)

int main()

//sleep(6);

pthread_cancel(id); //取消執行緒

int re = 0;

// sleep(1);

if(0 == pthread_join(id,null)) //等待 id這個執行緒結束,等待成功返回零,失敗返回錯誤號

else

return re;

}

賜教!

linux執行緒控制

1.執行緒屬性 a 分離狀態 不需要了解執行緒返回終止狀態時設定 b 棧末尾警戒緩衝區 避免棧溢位的擴充套件記憶體大小,一般系統設定為頁的整數倍 c 棧的最小位址 i.當有許多執行緒時,減少棧大小 ii.當執行緒中有許多自動變數時,則增大棧大小 d 棧的最小長度 2.互斥量屬性 a 程序共享屬性 i...

Linux 執行緒控制

話不多說,直接進入正題!1.什麼是執行緒?2.執行緒控制 2.1 執行緒建立int pthread create pthread t tid,pthread attr t attr,void start routine void void arg tid 返回執行緒id attr 設定執行緒的屬性,...

《Linux》 執行緒控制

posix執行緒庫 與執行緒有關的函式構成了乙個完整的系列,絕大多數函式的名字都是以 pthread 打頭的 要使用這些函式庫,要通過引入頭文 鏈結這些執行緒函式庫時要使用編譯器命令 lpthread 選項 建立執行緒 功能 建立乙個新的執行緒 原型 int pthread create pthre...