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来结束线程。线程执行的代码段结束了,它自己会退出的,你只需要考虑什么时候让它的代码段结束就行了。
添加回答
举报