pthread join函式及linux執行緒

2021-06-08 22:25:26 字數 2811 閱讀 4687

分類: 程式相關

2008-05-08 18:14

1045人閱讀收藏 

舉報pthread_join使乙個執行緒等待另乙個執行緒結束。

**中如果沒有pthread_join主線程會很快結束從而使整個程序結束,從而使建立的執行緒沒有機會開始執行就結束了。加入pthread_join後,主線程會一直等待直到等待的執行緒結束自己才結束,使建立的執行緒有機會執行。

所有執行緒都有乙個執行緒號,也就是thread id。其型別為pthread_t。通過呼叫pthread_self()函式可以獲得自身的執行緒號。

下面說一下如何建立乙個執行緒。

通過建立執行緒,執行緒將會執行乙個執行緒函式,該執行緒格式必須按照下面來宣告:

void * thread_function(void *)

建立執行緒的函式如下:

int pthread_create(pthread_t *restrict thread,

const pthread_attr_t *restrict attr,

void *(*start_routine)(void*), void *restrict arg);

下面說明一下各個引數的含義:

thread:所建立的執行緒號。

attr:所建立的執行緒屬性,這個將在後面詳細說明。

start_routine:即將執行的執行緒函式。

art:傳遞給執行緒函式的引數。

下面是乙個簡單的建立執行緒例子:

#include

#include

/* prints x』s to stderr. the parameter is unused. does not return. */

void* print_xs (void* unused)

/* the main program. */

int main ()

在編譯的時候需要注意,由於執行緒建立函式在libpthread.so庫中,所以在編譯命令中需要將該庫匯入。命令如下:

gcc –o createthread –lpthread createthread.c

如果想傳遞引數給執行緒函式,可以通過其引數arg,其型別是void *。如果你需要傳遞多個引數的話,可以考慮將這些引數組成乙個結構體來傳遞。另外,由於型別是void *,所以你的引數不可以被提前釋放掉。

下面乙個問題和前面建立程序類似,不過帶來的問題迴避程序要嚴重得多。如果你的主線程,也就是main函式執行的那個執行緒,在你其他縣城推出之前就已經退出,那麼帶來的bug則不可估量。通過pthread_join函式會讓主線程阻塞,直到所有執行緒都已經退出。

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

thread:等待退出執行緒的執行緒號。

value_ptr:退出執行緒的返回值。

下面乙個例子結合上面的內容:

int main ()

下面說一下前面提到的執行緒屬性。

在我們前面提到,可以通過pthread_join()函式來使主線程阻塞等待其他執行緒退出,這樣主線程可以清理其他執行緒的環境。但是還有一些執行緒,更喜歡自己來清理退出的狀態,他們也不願意主線程呼叫pthread_join來等待他們。我們將這一類執行緒的屬性稱為detached。如果我們在呼叫pthread_create()函式的時候將屬性設定為null,則表明我們希望所建立的執行緒採用預設的屬性,也就是jionable。如果需要將屬性設定為detached,則參考下面的例子:

#include

#include

void * start_run(void * arg)

int main()

執行緒可以通過自身執行結束來結束,也可以通過呼叫pthread_exit()來結束執行緒的執行。另外,執行緒甲可以被執行緒乙被動結束。這個通過呼叫pthread_cancel()來達到目的。

int pthread_cancel(pthread_t thread);

函式呼叫成功返回0。

當然,執行緒也不是被動的被別人結束。它可以通過設定自身的屬性來決定如何結束。

執行緒的被動結束分為兩種,一種是非同步終結,另外一種是同步終結。非同步終結就是當其他執行緒呼叫pthread_cancel的時候,執行緒就立刻被結束。而同步終結則不會立刻終結,它會繼續執行,直到到達下乙個結束點(cancellation point)。當乙個執行緒被按照預設的建立方式建立,那麼它的屬性是同步終結。

通過呼叫pthread_setcanceltype()來設定終結狀態。

int pthread_setcanceltype(int type, int *oldtype);

state:要設定的狀態,可以為pthread_cancel_deferred或者為pthread_cancel_asynchronous。

那麼前面提到的結束點又是如何設定了?最常用的建立終結點就是呼叫pthread_testcancel()的地方。該函式除了檢查同步終結時的狀態,其他什麼也不做。

上面乙個函式是用來設定終結狀態的。還可以通過下面的函式來設定終結型別,即該執行緒可不可以被終結:

int pthread_setcancelstate(int state, int *oldstate);

state:終結狀態,可以為pthread_cancel_disable或者pthread_cancel_enable。具體什麼含義大家可以通過單詞意思即可明白。

最後說一下執行緒的本質。

其實在linux中,新建的執行緒並不是在原先的程序中,而是系統通過乙個系統呼叫clone()。該系統copy了乙個和原先程序完全一樣的程序,並在這個程序中執行執行緒函式。不過這個copy過程和fork不一樣。copy後的程序和原先的程序共享了所有的變數,執行環境。這樣,原先程序中的變數變動在copy後的程序中便能體現出來。

pthread join函式及linux執行緒

pthread join使乙個執行緒等待另乙個執行緒結束。中如果沒有pthread join主線程會很快結束從而使整個程序結束,從而使建立的執行緒沒有機會開始執行就結束了。加入pthread join後,主線程會一直等待直到等待的執行緒結束自己才結束,使建立的執行緒有機會執行。所有執行緒都有乙個執行...

pthread join函式及linux執行緒

pthread join函式及linux執行緒 pthread join使乙個執行緒等待另乙個執行緒結束。中如果沒有pthread join主線程會很快結束從而使整個程序結束,從而使建立的執行緒沒有機會開始執行就結束了。加入pthread join後,主線程會一直等待直到等待的執行緒結束自己才結束,...

多執行緒 pthread join函式詳解

from 單處理器上的linux多執行緒,是通過分時操作完成的 此時互斥鎖的作用,只有在時間足夠的情況下才能體現出來,即有時執行緒內需要延時 否則只有第乙個執行緒不斷解鎖和獲鎖,別的執行緒在第乙個執行緒執行完前無法獲得互斥鎖。函式pthread join用來等待乙個執行緒的結束。函式原型為 exte...