㈠ linux線程的幾種結束方式
Linux線程的幾種結束方式
Linux創建線程使用
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
1
2
Linux線程的幾種結束方式:
調用pthread_exit(exit_code),exit_code為線程退出的狀態代碼。同一進程下的其他線程可以通過pthread_join(exit_code)來使用。
函數start_routine使用return返回,與調用pthread_exit()作用相同。
線程被取消pthread_cancel()。
同一進程中的其他線程調用了exit(),,或者主線程從main函數返回。
㈡ linux 進程退出 線程怎麼關閉
一般情況會自己關閉,如果很長時間都還在,就強制kill -9
㈢ 在Linux編程中,父進程為什麼要等待並回收子進程的退出狀態不這樣做會有什麼後果
分幾種情況:
父進程永不退出:這種情況下若子進程退出,而父進程沒有收集子進程的退出狀態,則此子進程會變為僵屍進程,一直佔用少量資源,有危害;
父進程比子進程先退出:這種情況下父進程退出時,仍在運行的子進程會變為孤兒進程,孤兒進程會被託管給init進程,孤兒進程結束時由init進程負責回收;
父進程比子進程晚退出:子進程先退出時會變為僵屍進程,佔用少量資源;待到父進程再退出時,子進程由僵屍進程變為孤兒進程,init進程會回收這些已僵死的孤兒進程,則這些已經僵死的孤兒進程就能瞑目而去了;
㈣ linux子線程掛掉主線程會退出嗎
會的。例如段錯誤之類的錯誤,直接會導致程序退出。 所以你要主線程還能正常運行的,就要對子線程的錯誤做錯誤處理。
㈤ linux怎麼查看線程阻塞原因
linux查看線程阻塞原因:pthread_join一般主線程來調用,用來等待子線程退出,因為是等待,所以是阻塞的,一般主線程會依次join所有它創建的子線程。
1)執行top命令,或使用-H選項(顯示所有線程),找到相關的高CPU的PID。
2)生成thread mp 快照(kill -3 PID)。
3)將top命令輸出PID轉換為HEX格式(16進制)。
4)在thread mp data中搜索nid=<Hex PID>。
5)分析受影響的thread和stack trace,精確定位代碼。
特點:
Linux,全稱GNU/Linux,是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。伴隨著互聯網的發展,Linux得到了來自全世界軟體愛好者、組織、公司的支持。
它除了在伺服器方面保持著強勁的發展勢頭以外,在個人電腦、嵌入式系統上都有著長足的進步。使用者不僅可以直觀地獲取該操作系統的實現機制,而且可以根據自身的需要來修改完善Linux,使其最大化地適應用戶的需要。
Linux不僅系統性能穩定,而且是開源軟體。其核心防火牆組件性能高效、配置簡單,保證了系統的安全。在很多企業網路中,為了追求速度和安全,Linux不僅僅是被網路運維人員當作伺服器使用,甚至當作網路防火牆,這是Linux的一大亮點。
Linux具有開放源碼、沒有版權、技術社區用戶多等特點,開放源碼使得用戶可以自由裁剪,靈活性高,功能強大,成本低。尤其系統中內嵌網路協議棧,經過適當的配置就可實現路由器的功能。這些特點使得Linux成為開發路由交換設備的理想開發平台。
㈥ LINUX里,父進程退出了,子進程一定會退出嗎
不。
若父進程退出,子進程尚未結束,則子進程會被init進程領養,也就是說init進程將成為該子進程的父進程。
若希望父進程退出,子進程也退出的話,可以使用線程,因為若進程結束,則還沒結束的線程一定會立刻結束。或者如樓上所說,用信號,用atexit注冊一個退出時執行的函數,這個函數中發送信號給子進程即可。
㈦ linux下C中怎麼讓才能安全關閉線程
多線程退出有三種方式:
(1)執行完成後隱式退出;
(2)由線程本身顯示調用pthread_exit 函數退出;
pthread_exit (void * retval) ;
(3)被其他線程用pthread_cance函數終止:
pthread_cance (pthread_t thread) ;
用event來實現。
在子線程中,在循環內檢測event。
while(!e.is_active())
{
...
}
當退出循環體的時候,自然return返回。這樣子線程會優雅的結束。
注意:選用非等待的檢測函數。
pthread 線程有兩種狀態,joinable(非分離)狀態和detachable(分離)狀態,默認為joinable。
joinable:當線程函數自己返回退出或pthread_exit時都不會釋放線程所用資源,包括棧,線程描述符等(有人說有8k多,未經驗證)。
detachable:線程結束時會自動釋放資源。
Linux man page said:
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
因此,joinable 線程執行完後不使用pthread_join的話就會造成內存泄漏。
解決辦法:
1.// 創建線程前設置 PTHREAD_CREATE_DETACHED 屬性
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread, &attr, &thread_function, NULL);
pthread_attr_destroy (&attr);
2.當線程為joinable時,使用pthread_join來獲取線程返回值,並釋放資源。
3.當線程為joinable時,也可在線程中調用 pthread_detach(pthread_self());來分離自己。
㈧ Linux C中父進程退出時,使用什麼方法可使子進程退出
發信號,kill(子進程ID, SIG信號)
如果不只一個子進程,需要把所有的子進程ID存起來,然後用上述方法一個一個的kill
SIG信號需要能使子進程退出,如SIGQUIT,SIGINT...等一些默認的信號;也可以在子進程中捕獲某些信號,然後子進程收到後自己退出
注意:最好是在子進程退出時,父進程要等待所有子進程退出