多執行緒程式設計 執行緒的建立和終止

2021-07-08 13:40:26 字數 4085 閱讀 3803

1

.引言:

linux

系統下的多執行緒遵循

posix

執行緒介面,稱為

pthread

。編寫linux

下的多執行緒程式,需要使用標頭檔案

pthread.h

,連線時需要使用庫

libpthread.a

。順便說一下,

linux

下pthread

的實現是通過系統呼叫

clone

()來實現的。

clone

()是linux

所特有的系統呼叫,它的使用方式類似

fork

,關於clone

()的詳細情況,有興趣的讀者可以去檢視有關文件說明。

pthread_t

在標頭檔案

/usr/include/bits/pthreadtypes.h

中定義:

typedef unsigned long int pthread_t;

它是乙個執行緒的識別符號。

2

.函式說明:

(1)

函式原型:

#include

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);                

返回值:若是成功建立執行緒返回0,否則返回錯誤的編號

形式引數:

pthread_t *restrict tidp 

要建立的執行緒的執行緒id指標

const pthread_attr_t *restrict attr 

建立執行緒時的執行緒屬性

void* (start_rtn)(void) 

返回值是void型別的指標函式

void *restrict arg   start_rtn

的行參

例題

1:

功能:測試

建立乙個新的執行緒

程式名稱: pthread_test.c     

#include

#include

void *create(void *arg)

int main(int argc,char *argv)

printf("prthread_create is created... ");

return 0;

}編譯方法:

#gcc -wall -lpthread pthread_test.c

因為pthread的庫不是linux

系統的庫,所以在進行編譯的時候要加上-lpthread,否則編譯不過,會出現下面錯誤:

thread_test.c: 

在函式 『create』 中:

thread_test.c:7: 

警告: 在有返回值的函式中,程式流程到達函式尾

/tmp/ccobjmud.o: in function `main':thread_test.c:(.text+0x4f)

:對『pthread_create』未定義的引用

collect2: ld 返回 1

2

、執行緒的終止與結束

(1) 

終止執行緒

函式原型:

void pthread_exit(void *status);

引數:其中

*retval

返回值: 

當呼叫執行緒是程序中的最後乙個非守護執行緒,程序將用狀態

0退出。當最初的執行緒從

main()

函式中返回時程序用該執行緒

main

函式的返回值退出。

(2) 

等待執行緒結束

原型如下:

int pthread_join(pthread_t th, void **thread_return)

引數:th 

為被等待的執行緒識別符號

thread_return 

為乙個使用者定義的指標,它可以用來儲存被等待執行緒的返回值

作用:函式

pthread_join

用來等待乙個執行緒的結束。

說明:這個函式是乙個執行緒阻塞的函式,呼叫它的函式將一直等待到被等待的執行緒結束為止

,當函式返回時,被等待執行緒的資源被收回。此函式用於程序和執行緒的同步,防止主線程提前結束,致使其它執行緒無法執行。如主線程建立了兩個執行緒,就有可能在兩個派生執行緒沒有執行時,主線程就已經結束了,而主線程結束,對系統而言,就意味這個程序已經結束,那麼派生執行緒自然就沒有機會執行了。所以用

pthread_join

等待派生執行緒的結束

返回值:呼叫成功時返回

0,否則將返回乙個非

0的錯誤**。

3)分離執行緒

pthread_detach

int pthread_detach(pthread_t tid);

作用:將非分離的執行緒設定為分離執行緒。即通知執行緒庫在指定的執行緒終止時**執行緒占用的記憶體等資源。

返回值:函式成功返回

0。任何其他返回值都表示錯誤。

在乙個執行緒上使用多次

pthread_detach

的結果是不可預見的。

4)執行緒的取消

當我們希望終止乙個執行緒時,我們可以使用函式

pthread_cancel()

。其原型定義如下:

原型:int pthread_cancel(pthread_t thread);

說明:這個函式以乙個執行緒

id作為參量,向此執行緒傳送乙個取消請求。執行緒處理這個請求的方式取決於執行緒的狀態。它可能立即作出反映,也可能等到它得到乙個取消點時在行動,也可能完全忽略它。

5)設定執行緒取消狀態

執行緒可以用

pthread_setcancelstate

函式來設定自己的取消狀態,

原型定義如下:

int pthread_setcancelstate(int state, int *oldstate);

引數說明:

state 

取值可以是

pthread_cnacel_enable

,這個值允許執行緒接收取消請求;或是

pthread_cnacel_enable

,它的作用是忽略取消請求。

oldstate 

用於獲取先前的取消狀態。如果取消請求接受了,執行緒可以進入第二個控制層次,用

pthread_setcanceltype

設定取消型別。

6)設定取消型別

原型定義如下:

int pthread_setcanceltype(int type, int *oldtype);

引數說明:

type 

取值可以是

pthread_cancel_asynchronous

,它將使得執行緒在接收到取消請求後立即處理

(asynchronous)

,或是pthread_cancel_deferred

,它將使得執行緒在接收到取消請求後,一直推遲處理,直到遇到乙個取消點(

defer

)之後才處理。

odtype 

作用是允許儲存先前的狀態,如果不想直到先前的狀態,可以傳遞

null

給它。

在預設的情況下,執行緒在啟動是的取消狀態為

pthread_cnacel_enable

,取消型別為

pthread_cancel_deferred

多執行緒程式設計 執行緒的建立和終止

1 引言 linux 系統下的多執行緒遵循posix 執行緒介面,稱為pthread 編寫linux 下的多執行緒程式,需要使用標頭檔案pthread.h 連線時需要使用庫libpthread.a 順便說一下,linux 下pthread 的實現是通過系統呼叫clone 來實現的。clone 是li...

多執行緒程式設計 執行緒的建立和終止

1 引言 linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。編寫linux下的多執行緒程式,需要使用標頭檔案pthread.h,連線時需要使用庫libpthread.a。順便說一下,linux下pthread的實現是通過系統呼叫clone 來實現的。clone 是linux所特...

多執行緒程式設計 執行緒的建立和終止

1 引言 linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。編寫linux下的多執行緒程式,需要使用標頭檔案pthread.h,連線時需要使用庫libpthread.a。順便說一下,linux下pthread的實現是通過系統呼叫clone 來實現的。clone 是linux所特...