線程終止: 1.start_routine回調(diào)函數(shù)執(zhí)行return; 2.線程自身調(diào)用pthread_exit(); 3.其他線程調(diào)用pthread_cancel(ID)將此進(jìn)程終止; 任意線程調(diào)用exit()使整個(gè)進(jìn)程退出。 線程回收:線程默認(rèn)joinable狀態(tài),終止后需使用pthread_join回收資源;將子線程使用pthread_detach從主線程分離后處于unjoinable狀態(tài),系統(tǒng)等線程退出后自動(dòng)回收資源。 常用的 函數(shù)調(diào)用如下: pthread_exit():結(jié)束本線程 #include void pthread_exit(void *retval); 參數(shù)含義: retval:線程返回值,其他線程調(diào)用pthread_join()接收。 pthread_cancel():向指定線程發(fā)出取消請求,使用pthread_join回收, #include int pthread_cancel(pthread_t thread); 參數(shù)含義: thread:要終止的線程ID; 返回值:執(zhí)行成功返回0,成功不一定會(huì)讓指定線程終止;執(zhí)行失敗返回錯(cuò)誤號(hào), pthread_join():等待線程終止回收資源,獲取返回值retval, #include int pthread_join(pthread_t thread, void **retval); 參數(shù)含義: thread:線程 ID。 retval:存放回收線程的返回值。 返回值:成功返回0,失敗返回錯(cuò)誤號(hào)。 pthread_detach():分離線程,線程終止后系統(tǒng)自動(dòng)清理,分離后不能再使用join獲取狀態(tài), #include int pthread_detach(pthread_t thread); 參數(shù)含義:要分離的線程 ID。 返回值:成功返回0,失敗返回錯(cuò)誤號(hào)。 本章代碼在thread/目錄下,實(shí)驗(yàn)1:路徑為:11_Linux系統(tǒng)開發(fā)進(jìn)階\Linux系統(tǒng)編程_章節(jié)使用資料。 使用pthread_cancel讓線程退出,pthread_join回收,代碼在cancel.c: ![]() 編譯:gcc cancel.c -o cancel -lpthread,運(yùn)行結(jié)果: ![]() 使用pthread_exit讓線程退出,pthread_join回收線程資源,代碼在/thread/exit/目錄下, 線程依次使用pthread_exit退出,然后pthread_join依次回收線程,main.c: ![]() 編譯運(yùn)行,可以看到線程按順序依次退出并打印pthread_exit的返回值: ![]() 實(shí)驗(yàn)三: 使用pthread_detach()設(shè)置線程分離,pthread_exit()退出后,系統(tǒng)自動(dòng)回收,最后調(diào)用pthread_join()發(fā)現(xiàn)報(bào)錯(cuò),說明線程分離后線程自動(dòng)釋放。 實(shí)驗(yàn)代碼在detach.c:路徑為:11_Linux系統(tǒng)開發(fā)進(jìn)階\Linux系統(tǒng)編程_章節(jié)使用資料。 ![]() ![]() 編譯,gcc -o detach detach.c -lpthread,運(yùn)行結(jié)果如下,發(fā)現(xiàn)使用pthread_join()報(bào)錯(cuò): ![]() |