執行緒控制1

2022-07-12 03:06:08 字數 2303 閱讀 2940

1.執行緒建立函式

#includeint pthread_create(pthread_t *thread, pthread_attr_t *attr, void*(*start_routine)(void*), void *arg);

引數解析

thread:當執行緒建立成功返回建立執行緒id;

attr:指定執行緒的屬性,大多使用null表示預設屬性

start_routine:函式指標,指向執行緒建立後要呼叫的函式。被呼叫的執行緒函式也被稱為執行緒函式。

arg:該引數指向傳遞給執行緒函式的引數。

注:執行緒建立成功時,函式會返回0,若返回值不為0則說明執行緒建立失敗。

#include#include#includeint thread(void *arg)

int main()

sleep(1);

return 0;

}

執行一下

為啥gcc後邊要加 -lpthread呢?

原因是pthread 庫不是 linux 系統預設的庫,連線時需要使用靜態庫 libpthread.a,所以在使用pthread_create()建立執行緒,以及呼叫 pthread_atfork()函式建立fork處理程式時,需要鏈結該庫。

看著就像是主程式叫了乙個小弟幫他幹活,彷彿和主函式呼叫函式一樣,但事實並不是這樣。將倒數第二行**去掉以後會發現執行緒函式thread並不會被執行,因為主線程結束了則整個程序截止了,此時程序中的所有執行緒也也將終止,這也是執行緒和普通函式呼叫的一大區別。

注:pthread_self()函式即為獲取執行緒號的函式。

2.執行緒終止

linux有兩種方式可以使執行緒終止。一種通過return從執行緒函式返回,另一種是使用pthread_exit()函式退出執行緒。

這裡有兩種情況需要注意:

乙個情況是上面剛剛提到的main函式返回或者使用了exit函式退出主程序,則程序內所有執行緒也將終止。

另乙個情況是如果只是主線程呼叫了pthread_exit()函式,僅僅是主線程死亡,程序不會結束,而且在主線程內建立的其他執行緒也不會被終止,直到所有執行緒結束,程序才會結束。

例如:

#include#include#include#includeint thread1(void *arg)

int thread(void *arg)

pthread_exit(1);

}void main()

pthread_exit(1);

}

執行結果

這次主程式並沒有掛起來等待執行緒,而是在最後使用pthread_exit()退出,其他子執行緒並沒受到影響。

#includevoid pthread_exit(void *retval);

int pthread_join(pthread_t th, void *thread_return);

int pthread_detach(pthread_t th);

函式ptread_join用來等待乙個執行緒的結束。pthread_join()的呼叫者將被掛起等待執行緒號為th的執行緒終止,如果th執行緒退出使用了pthread_exit(),則*thread_return = retval。

注意:乙個執行緒僅能允許被乙個執行緒使用pthread_exit()等待它的終止·,並且被等待的執行緒應該處於可join狀態,不可以為detached狀態。detached狀態是指某個執行緒執行pthread_detach()後其所處的狀態。處於detached狀態的執行緒無法由pthread_join()同步。

乙個可「join」的執行緒所占用的記憶體僅當有執行緒對其執行了pthread_join()後才會釋放,因此為避免記憶體洩漏,所有執行緒的終止時,要麼被設為detached,要麼使用pthread_join**資源。

例程

#include#include#include#includevoid test(void *arg)

int main()

執行結果

「test's exit is cause 6」這句活在上一句列印後約5秒才被列印出來,說明呼叫pthread_join的執行緒的確會被掛起等待要等的執行緒結束才會繼續執行。

執行緒控制 join執行緒

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

執行緒 之 執行緒控制

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

執行緒控制函式

執行緒共享資源如下 靜態資料 程序中開啟的檔案描述符 當前工作目錄 使用者i d int pthread create pthread t thread,pthread attr t attr,void start routine void void arg 函式作用建立乙個執行緒 thread 執...