2 回答

TA貢獻1805條經驗 獲得超10個贊
可以手動設置線程退出的時機。通過 int pthread_setcanceltype(int type, int *oldtype)設置本線程取消動作的執行時機,type由兩種取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYNCHRONOUS,僅當Cancel狀態為Enable時有效,分別表示收到信號后繼續運行至下一個取消點再退出和 立即執行取消動作(退出);oldtype如果不為NULL則存入運來的取消動作類型值。此函數應該在線程開始時執行,若線程內部有任何資源申請等操作,應該選擇 PTHREAD_CANCEL_DEFFERED 的設定,然后在退出點(pthread_testcancel 用于定義退出點)進行線程退出。void pthread_testcancel(void)檢查本線程是否處于Canceld狀態,如果是,則進行取消動作,否則直接返回。 此函數在線程內執行,執行的位置就是線程退出的位置,在執行此函數以前,線程內部的相關資源申請一定要釋放掉,他很容易造成內存泄露。

TA貢獻1836條經驗 獲得超3個贊
我大致理解你的運用場景了。一般通用的做法是這樣的:在新線程的入口程序里面通常會有如下代碼段:while(sys_state != SYS_SHUT_DOWN){ if(hasJobs()) { //here process you jobs } else { sleep(nnnnn);//等著任務的到來 }}接下來的代碼就是函數返回及線程退出之前的資源回收了一般都不會主動使用thread_cancel來結束線程。線程執行的代碼段結束了,它自己會退出的,你只需要考慮什么時候讓它的代碼段結束就行了。
添加回答
舉報