關於執行緒控制,主要就是幾個模組,我們乙個乙個消滅、消化:
一、執行緒建立:
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...