之前对于线程如何退出一直不是特别清楚,以前发现用pthread_kill函数退出线程没有效果,今天看了一些别人的博客才发现线程退出的原理,而且pthread_kill函数只是向特定的线程发信号。下面是一些如何在死循环中结束线程的方法。
第一:可以利用pthread_kill函数向线程发信号,而后在信号处理函数里面设置一个flag,当线程中检测到该该flag置位后退出死循环,结束线程。
pthread_kill(pthread_t tid,int sig)
第一个参数为需要kill的线程的线程id,第二个参数为信号。注意,信号为SIGQUIT,但线程未处理该信号会导致线程所在的进程退出。
第二:可以使用pthread_cancel函数向需要退出的线程发送CANCEL信号,然后在线程中使用pthread_testcancel函数检测是否有CANCEL信号发过来。收到该信号就可以直接退出了。
pthread_cancel(pthread_t tid); 向线程发送CANCEL信号。
pthread_testcancel();检测是否收到CANCEL信号。
另外可以用下列函数可以设置如何退出线程。
int pthread_setcancelstate(int state, int *oldstate) 设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE, 分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为NULL则存入原来的Cancel状态以便恢复。
int pthread_setcanceltype(int type, int *oldtype) 设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYCHRONOUS, 仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立 即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。
第三:pthread_exit函数,这个是线程主动退出。