pthread_join使乙個執行緒等待另乙個執行緒結束。
**中如果沒有pthread_join主線程會很快結束從而使整個程序結束,從而使建立的執行緒沒有機會開始執行就結束了。加入pthread_join後,主線程會一直等待直到等待的執行緒結束自己才結束,使建立的執行緒有機會執行。
所有執行緒都有乙個執行緒號,也就是thread id。其型別為pthread_t。通過呼叫pthread_self()函式可以獲得自身的執行緒號。
下面說一下如何建立乙個執行緒。
通過建立執行緒,執行緒將會執行乙個執行緒函式,該執行緒格式必須按照下面來宣告:
void * thread_function(void *)
建立執行緒的函式如下:
quote:
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:傳遞給執行緒函式的引數。
下面是乙個簡單的建立執行緒例子:
quote:
#include
#include
void* print_xs (void* unused)
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:退出執行緒的返回值。
下面乙個例子結合上面的內容:
quote:
int main ()
下面說一下前面提到的執行緒屬性。
在我們前面提到,可以通過pthread_join()函式來使主線程阻塞等待其他執行緒退出,這樣主線程可以清理其他執行緒的環境。但是還有一些執行緒,更喜 歡自己來清理退出的狀態,他們也不願意主線程呼叫pthread_join來等待他們。我們將這一類執行緒的屬性稱為detached。如果我們在呼叫 pthread_create()函式的時候將屬性設定為null,則表明我們希望所建立的執行緒採用預設的屬性,也就是jionable。如果需要將屬性 設定為detached,則參考下面的例子:
quote:
#include
#include
void * start_run(void * arg)
int main()
對pthread join的理解
linux中的應用 在 linux中,預設情況下是在乙個 執行緒被建立後,必須使用此函式對建立的執行緒進行資源 但是可以設定threads attributes來設定當乙個執行緒結束時,直接 此執行緒所占用的系統資源,詳細資料檢視threads attributes。其實在linux中,新建的執行緒...
多執行緒pthread join 的作用
pthread join 函式原型 int pthread join pthread t thread,void retval args pthread t thread 被連線線程的執行緒號 void retval 指向乙個指向被連線線程的返回碼的指標的指標 引數 thread 執行緒識別符號,即...
不想讓pthread join阻塞你的程序
建立乙個執行緒預設的狀態是joinable,如果乙個執行緒結束執行但沒有被join,則它的狀態類似於程序中的zombie process,即還有一部分資源沒有被 退出狀態碼 所以建立執行緒者應該pthread join來等待執行緒執行結束,並可得到執行緒的退出 其資源 類似於wait,waitpid...