①執行緒連線
[1]int pthread_join(pthread_t thread, void **retval);
pthread_t: 等待的執行緒尚未退出,那麼 pthread_join 的呼叫執行緒就會陷入阻塞。
retval: 接收返回值
· 等待的執行緒尚未退出,那麼pthread_join 的呼叫執行緒就會陷入阻塞。
· 等待的執行緒已經退出,那麼pthread_join 函式會將執行緒的退出值(void* 型別存放到retval)指標指向的位置。
1.pthread_join 函式之所以能夠判斷是否死鎖和連線操作是否被其他執行緒捷足先登,是因為目標執行緒的控制結構體 struct pthread 中,存在如下成
員變數,記錄了該執行緒的連線者。
2.直接連線自己, 或者a連線b, b又連線a
[2]執行緒連線(join)與程序等待(wait)的不同點
1.程序之間的等待只能是父程序等待子程序,
2.執行緒組內的成員是對等的關係,執行緒組內的任一線程都可其他執行緒進行連線(join)
3.程序等待可以等待乙個程序組內的所有執行緒(waipid)
4.執行緒的連線操作只能單獨連線某個具體的執行緒: 當庫函式嘗試連線( join )私自建立的執行緒時,發現已經被連線過了,就會返回einval 錯誤。
[3]為什麼要連線退出的執行緒?
1.已經退出的執行緒,其空間沒有被釋放,仍然在程序的位址空間之內。
2.新建立的執行緒,沒有復用剛才退出的執行緒的位址空間。
==> 造成資源洩漏
3.當執行緒組內的其他執行緒呼叫pthread_join連線退出執行緒時,內部會呼叫__free_tcb函式,該函式會負責釋放退出執行緒的資源。
4.縱然呼叫了pthread_join,也並沒有立即呼叫munmap來釋放掉退出執行緒的棧,它們是被後建的執行緒復用了。(再次反覆建立執行緒,分配執行緒棧會影響效能)
②執行緒分離 (新建執行緒預設為不可分離)
[1]設定執行緒為可分離狀態
int pthread_detach(pthread_t thread);
thread: 要分離的執行緒標識id
1.如果其他執行緒並不關心執行緒的返回值,連線操作就會變成一種負擔: 不連線會造成執行緒資源不釋放(洩漏記憶體)
2.被設定為分離的執行緒: 執行緒退出時,系統自動將執行緒相關的資源釋放掉,無須等待連線。
3.可以是執行緒組內其他執行緒對目標執行緒進行分離,也可以是執行緒自己執行 pthread_detach 函式,將自身設定成已分離的狀態
pthread_detach(pthread_self()) // 將本執行緒設定為可分離狀態
4.如果執行緒處於已分離的狀態,其他執行緒嘗試連線線程時,會返回 einval 錯誤。
5.所謂已分離: 是指執行緒退出後,系統會自動釋放執行緒資源。
[2]建立執行緒時, 將執行緒的屬性設定為已分離(建立已分離執行緒) // 執行緒退出後, 系統自動**資源
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,pthread_create_detached);
thread_create(&tid, &attr, func,arg);
// 獲取執行緒分離狀態
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr,int *detachstate);
③.示例**:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int ret = 123;
void *start_routime1(void *arg) /* 主線程關心執行緒退出的返回值 */
void *start_routime2(void *arg) /* 主線程不關心執行緒退出的返回值 */
/* 這是乙個已分離的執行緒, 執行緒退出後系統自動釋放資源 */
void *start_routime3(void *arg) /* 主線程不關心執行緒退出的返回值 */
int main(int argc, char **argv)
/* 執行結果:
book@gui_hua_shu$ gcc -o t join_detach.c -lpthread
book@gui_hua_shu$ ./t
-------------------1--------------------------------
start_routime1
pret = 123
-------------------2--------------------------------
start_routime2
------------------3---------------------------------
pthread 3 pthread_create_detached
pthread_create3 err: success
*/
Linux多執行緒學習(二)執行緒的連線與分離
執行緒分為分離執行緒和非分離執行緒,分離執行緒退出時會釋放它的資源,非分離執行緒退出時,不會釋放資源,需要另乙個執行緒為它呼叫pthread join函式或者程序退出時才會釋放資源,只有非分離執行緒才是可連線的,執行緒一旦設定為pthread create detach狀態 不論是建立時設定還是執行...
執行緒的分離狀態
執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當 pthread join 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己運 行結束了,...
執行緒的分離狀態
執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性,一般是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread join 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止...