執行緒控制(二) 執行緒等待與分離

2021-08-19 08:06:05 字數 1944 閱讀 5787

執行緒等待

為什麼需要執行緒等待呢?

1、已經退出的執行緒,其空間沒有被釋放,任然在程序的位址空間內

2、建立新的執行緒不會服用剛才退出執行緒的位址空間

pthread_join函式:

//等待執行緒結束

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

//引數thread:執行緒id

//value_ptr:指向乙個指向執行緒的返回值的指標

//返回值:成功返回0,失敗返回錯誤碼

呼叫該函式的執行緒將掛起等待(阻塞式的等),直到id為thread的執行緒終止。thread執行緒以不同的方法終止,通過pthread_join得到的終止狀態是不同的:

1、如果thread執行緒通過return返回,value_ptr所指向的單元裡存放的是thread執行緒函式的返回值

2、如果被別的執行緒呼叫pthread_cancel異常終 止掉,value_ptr所指向的單元裡存放的是常數pthread_canceled((void*)-1

3、如果是自己呼叫pthread_exit終止的,value_ptr所指向的記憶體單元存放的是傳給pthread_exit的引數

4、如果對執行緒的終止狀態不關心,可以傳null給value_ptr引數

#include

#include

#include

#include

#include

void *thread1(void *arg)

void *thread2(void *arg)

void *thread3(void *arg)

return null;

}int main()

else

printf("thread return,thread id = %lu,return code : null\n",tid);

return

0;}

執行結果如下:

分離執行緒

預設情況下,新建立的執行緒是joinable的。執行緒退出以後,需要對其進行pthread_join操作,否則無法釋放資源,從而造成系統洩漏。

如果不關心執行緒的返回值,join是一種負擔,這個時候我們可以告訴系統,當執行緒退出時,自動釋放執行緒資源。

//執行緒組內其他執行緒對目標現執行緒進行分離

int pthread_detach(pthread_t thread);

//執行緒自己分離自己

int pthread_detach(pthread_self());

需要注意的一點就是:joinable和分離是衝突的,乙個執行緒不可能既是joinable又是分離的。執行緒被分離了,所以就不需要被等待了,結束以後會自動釋放資源,但是即使該執行緒被分離,一旦該執行緒出現異常時依舊會影響程序。

#include

#include

#include

#include

#include

void *thread_run(void *arg)

int main()

int ret = 0;

sleep(1);

if(pthread_join(tid,null) == 0)

else

return ret;

}

測試結果如下:

執行緒(二) 執行緒控制 後台執行緒

設定執行緒為後台執行緒,前台執行緒結束後,後台執行緒也就結束了 這個有乙個時間差 setdaemon boolean on 檢測線程是否是後台執行緒 isdaemon public class daemonthread extends thread param args public static ...

執行緒控制與執行緒分離

一 執行緒控制 1 執行緒概念 執行緒是資源排程的基本單位,執行緒是程序內部的乙個執行流,在程序的位址空間內執行。在linux 下沒有真正意義上的執行緒,執行緒是用程序模擬的,又被稱為輕量級程序。2 執行緒資源 乙個程式中的多個執行緒共享同一位址空間,因此 段,資料段內容是共享的。除此之外,以下內容...

執行緒控制 二

linux中有兩種方式使執行緒終止 1 通過return從執行緒函式返回 2 通過呼叫函式pthread exit 使執行緒退出 pthread exit在標頭檔案pthread.h中宣告,函式原型為 include void pthread exit void retval 注意 1 在主線程中,...