Linux 多線程環境下 進程線程終止函數小結


pthread_kill:

pthread_kill與kill有區別,是向線程發送signal。,大部分signal的默認動作是終止進程的運行,所以,我們才要用signal()去抓信號並加上處理函數。

int pthread_kill(pthread_t thread, int sig);

向指定ID的線程發送sig信號,如果線程代碼內不做處理,則按照信號默認的行為影響整個進程,也就是說,如果你給一個線程發送了SIGQUIT,但線程卻沒有實現signal處理函數,則整個進程退出

pthread_kill(threadid, SIGKILL)殺死整個進程。 如果要獲得正確的行為,就需要在線程內實現signal(SIGKILL,sig_handler)。所以,如果int sig的參數不是0,那一定要清楚到底要干什么,而且一定要實現線程的信號處理函數,否則,就會影響整個進程。

如果int sig是0呢,這是一個保留信號,一個作用是用來判斷線程是不是還活着。pthread_kill的返回值: 成功:0 線程不存在:ESRCH 信號不合法:EINVAL

代碼:

int kill_rc = pthread_kill(thread_id,0);

if(kill_rc == ESRCH) 
        printf("the specified thread did not exists or already quit\n"); 

else if(kill_rc == EINVAL) 
        printf("signal is invalid\n"); 
else 
        printf("the specified thread is alive\n");

 

pthread_cancel

函數原型:

int pthread_cancel(pthread_t thread);

向thread發送一個取消執行的請求。如果成功則返回0,否則為非0值。發送成功並不意味着thread會終止。成功返回零,出錯返回非零的出錯碼ESRCH:沒有找到thread指定ID的線程。

 

abort和exit的比較

exit會做一些釋放工作:釋放所有的靜態的全局的對象,緩存,關掉所有的I/O通道,然后終止程序。如果有函數通過atexit來注冊,還會按照atexit的相反順序調用注冊的函數。不過,如果atexit函數扔出異常的話,就會直接調用terminate。

abort:立刻terminate程序,沒有任何清理工作。

 

 

這里附上線程基本函數:

------------------------------------------------------------------------------------------
                     POSIX函數                                                    描述
-------------------------------------------------------------------------------------------
                    pthread_create                                    創建一個線程
                    pthread_self                                        找出自己的線程ID
                    pthread_equal                                     測試2個線程ID是否相等
                    pthread_detach                                   設置線程以釋放資源
                    pthread_join                                        等待一個線程
                    pthread_cancel                                    終止另一個線程
                    pthread_exit                                        退出線程,而不退出進程
                    pthread_kill                                         向線程發送一個信號
-------------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM