執行緒控制與執行緒分離

2021-08-14 07:46:48 字數 4117 閱讀 2436

一、執行緒控制 1

、執行緒概念:

執行緒是資源排程的基本單位,執行緒是程序內部的乙個執行流,在程序的位址空間內執行。linux

下沒有真正意義上的執行緒,執行緒是用程序模擬的,又被稱為輕量級程序。 2

、執行緒資源:

乙個程式中的多個執行緒共享同一位址空間,因此**段,資料段內容是共享的。

除此之外,以下內容也是共享的:

1. 檔案描述符表

2. 每種訊號的處理方式(sig_ign、sig_dfl或者自定義的訊號處理函式)

3. 當前工作目錄

4. 使用者id和組id

但有些資源是每個執行緒各有乙份的:

1. 執行緒id

2.上下文,包括各種暫存器的值、程式計數器和棧指標

3. 棧空間

4. errno變數

5. 訊號遮蔽字

6. 排程優先順序 3

、執行緒建立:

(1)建立函式: int pthread_create(pthread_t*thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

(2)獲取執行緒id:  pthread_tpthread_self(void);

建立函式說明:

建立成功:返回

0 ;建立失敗:返回錯誤碼,可將錯誤碼通過

strerror()

轉換為字串描述。 引數

1:執行緒

id位址(只在使用者區有效)。

(&id)

引數2:執行緒屬性,一般設定為

null

(非分離方式)。 引數

3:函式指標,指向執行緒函式。

(執行緒函式名) 引數

4:執行緒函式的引數。(一般為

null)

4、終⽌

執行緒 如果需要只終

⽌止某個執行緒

⽽而不終

⽌止整個程序

,可以有三種⽅方法

: 1)

. 從執行緒函式

return

。這種⽅

法對主線程不適用,從

main

函式return

相當於調

⽤exit。//

執行緒return 2

). 乙個執行緒可以呼叫

pthread_cancel

終止同一程序中的另乙個執行緒,用

pthread_cancel終⽌⼀

個執行緒分同步和非同步兩種情況。

//被動終止 3

). 執行緒可以呼叫

pthread_exit

終止自己。

//自己終止 5

、執行緒等待

int pthread_join(pthread_t thread, void **retval);

呼叫該函式等待的執行緒將掛起等待,直到id為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的引數。

注:對於執行緒進行join之後執行緒的狀態將是detach狀態(分離),同樣的pthread_cancel函式可以對執行緒進行分離處理。所以,不能同時對乙個執行緒進行join和detach操作

#include

#include

#include

void* thread1(void* arg)

void* thread2(void* arg) }

void* thread3(void* arg)//

被其他執行緒

cancel

return null;}

int main() 

執行結果:

注: 可見在linux的pthread庫中常數pthread_canceled的值是-1。可以在頭⽂檔案pthread.h中找到它的定義。

一般情況下,執行緒終止後,其終止狀態一直保留到其它執行緒呼叫pthread_join獲取它的狀態為止。 但是執行緒也可以被置為detach 狀態,這樣的執行緒一旦終止就⽴立刻**它占用的所有資源,而不保留終⽌止狀態。不能對乙個已經處於detach狀態的執行緒呼叫pthread_join,這樣的呼叫將返回einval。 對乙個尚未detach的執行緒呼叫pthread_join或pthread_detach都可以把該執行緒置為detach狀態,也就是說,不能對同一執行緒呼叫兩次pthread_join,或者如果已經對⼀乙個執行緒呼叫了pthread_detach就不能再呼叫pthread_join了

二、分離執行緒

在任何乙個時間點上,執行緒是可結合的(

joinable

)或者是分離的(

detached

)。乙個可結合的執行緒能夠被其他執行緒收回其資源和殺死。在被其他執行緒**之前,它的儲存器資源(例如棧)是不釋放的。相反,乙個分離的執行緒是不能被其他執行緒**或殺死的,它的儲存器資源在它終止時由系統自動釋放。

1、預設情況下,執行緒被建立成可結合的。為了避免儲存器洩漏,每個可結合執行緒結束後資源都要被**,要麼呼叫

pthread_join

;要麼呼叫

pthread_detach

函式被分離。如果乙個可結合執行緒結束執行但沒有被

join

,則它的狀態類似於程序中的

zombie process

,即還有一部分資源沒有被**,所以建立執行緒者應該呼叫

pthread_join

來等待執行緒運

⾏行結束,並可得到執行緒的退出**,**其資源。 2

、由於調⽤用

pthread_join

後,如果該執行緒沒有運

⾏行結束,調

⽤用者會被阻塞,在有些情況下我們並不希望如此。例如,在

web伺服器中當主線程為每個新來的連線請求建立乙個子執行緒進行處理的時候,主線程並不希望因為呼叫pthread_join

而阻塞(因為還要繼續處理之後到來的連線請求),這時可以在子執行緒中加入**

pthread_detach(pthread_self())

或者父執行緒呼叫

pthread_detach(thread_id)

(非阻塞,可立即返回)將該子執行緒的狀態設定為分離的(

detached

),如此一來,該執行緒執行結束後會自動釋放所有資源。

注意:如果設定乙個執行緒為分離執行緒,而這個執行緒執行又非常快,它很可能在pthread_create函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這樣呼叫pthread_create的執行緒就得到了錯誤的執行緒號。要避免這種情況可以採取一定的同步措施,最簡單的方法之一是可以在被建立的執行緒裡呼叫pthread_cond_timewait函式,讓這個執行緒等待一會兒,留出足夠的時間讓函式pthread_create返回。設定一段等待時間,是在多執行緒程式設計裡常用的方法。但是注意不要使用諸如wait()之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。

在預設情況下執行緒是非分離狀態的,這種情況下,主線程等待被建立的執行緒結束。只有當pthread_join()函式返回時,被建立的執行緒才算終止,才能釋放自己占用的系統資源。

#include

#include

#include

void* thread(void *_arg)

int main()

sleep(1);

pthread_detach(tid);//

將子執行緒屬性設定為分離(非阻塞,可立即返回)

void* val = null;

if((pthread_join(tid, &val) != 0))

else

return ret; }

執行緒控制(二) 執行緒等待與分離

執行緒等待 為什麼需要執行緒等待呢?1 已經退出的執行緒,其空間沒有被釋放,任然在程序的位址空間內 2 建立新的執行緒不會服用剛才退出執行緒的位址空間 pthread join函式 等待執行緒結束 int pthread join pthread t thread,void value ptr 引數...

執行緒控制 join執行緒

在我們做專案的時候時常會有這樣的一種需求 我們需要執行兩個方法,乙個方法要等另乙個方法執行完才能執行,這樣的狀況放到多執行緒中要怎麼實現呢?今天就來看看多執行緒中的join方法。我們的均方法通常是把乙個大問題分成許多小問題,每個小問題分配乙個執行緒,當所有的小問題都得到處理後,在呼叫主線程來進一步操...

執行緒 之 執行緒控制

下面有幾種方法可以很好的控制線程的執行。1.join 執行緒控制 2.後台執行緒 守護執行緒 3.sleep執行緒睡眠 4.yield執行緒讓步 1.join 執行緒控制。thread提供了讓乙個執行緒等待另外乙個執行緒完成的方法 join 方法 意思 當在a程式執行流 執行緒 中呼叫b執行緒的ji...