多线程(15) pthread_setcancelstate 及 其他线程取消函数
1. pthread_setcancelstate 定义:对Cancel信号的反应
1.1 pthread_cancel终止同一进程中的另一个线程
发送终止信号给线程,让其终止。
1.2 参数含义
设置本线程对Cancel信号的反应。
state有两种值:pthread_CANCEL_ENABLE(缺省)和pthread_CANCEL_DISABLE,
分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为NULL则存入原来的Cancel状态以便恢复。
1.3. 接口及参数
int pthread_setcancelstate(int state, int *oldstate)
参数:
state有两种值: PTHREAD_CANCEL_ENABLE (缺省)和 PTHREAD_CANCEL_DISABLE ,
old_state 如果不为NULL则存入原来的Cancel状态以便恢复。
old_state 为空,则不存原cencel状态
1.4. 代码例子:
int iOldState;
(VOID)pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &iOldState);
…………操作
(VOID)pthread_setcancelstate(iOldState, NULL);
解析:
上面代码表示,在中间一坨操作的时候忽略收到的 CANCEL 信号继续执行,结束后再设置为原始状态。
2. 其他线程取消(pthread_cancel)相关函数:pthread_cancel pthread_setcanceltype pthread_testcancel等
2.1 pthread_cancel
pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行,
直到到达某个取消点(CancellationPoint)。取消点是线程检查是否被取消并按照请求进行动作的一个位置.
int pthread_cancel(pthread_t thread)
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
2.2 pthread_setcanceltype
设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。
int pthread_setcanceltype(int type, int *oldtype)
2.3 pthread_testcancel
说pthread_testcancel在不包含取消点,但是又需要取消点的地方创建一个取消点,以便在一个没有包含取消点的执行代码线程中响应取消请求.
void pthread_testcancel(void)
3. 线程取消点概念
线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。
参考:
https://www.cnblogs.com/lijunamneg/archive/2013/01/25/2877211.html