对于pthread_cancel函数以及取消点的理解
1.pthread_cancel函数做了什么
pyhread_cancel函数只是给线程发送了一个请求该请求是希望可以将该线程终止。
所以对于该请求的话,只是对于线程的一个建议
线程也可能就不会立即终止,会继续运行,直到运行到取消点的时候该线程才会退出
2. 取消点的理解
取消点是线程检查他是否被取消的一个位置
取消点是如何出现的呢?
对于取消点对于使用某些函数就会出现取消点
例如:sleep,wait,waitpid,waitid,send等函数
如图:这些函数都可以作为取消点
3.pthread_setcancelstate
这个函数可以设置取消的状态,有两种状态PTHREAD_CANCEL_ENABLE(可取消状态)和PTHREAD_CANCEL_DISABLE(不可取消状态)。
#include <pthread.h> pthread_setcancelstate(int state, int* oldstate); 参数:
state:将当前状态改为state
oldstate:将该线程原先的状态放到oldtype所指向的空间里面 返回值:
成功返回0,失败返回错误码这两步是一个原子操作。
- 对于pthread_cancel函数默认的是PTHREAD_CANCEL_ENABLE可取消状态。,当状态设为PTHREAD_CANCEL_DISABLE时,对于pthread_cancel的调用并不会杀死线程。相反,该取消请求对于这个线程还处于挂起状态(也就是未决),直到线程的取消状态变为PTHREAD_CANCEL_ENABLE时,线程将在下一个取消点上对所有的挂起请求进行处理。
4. pthread_setcanceltype
设置取消的类型。
#include <thread.h> int pthread_testcanceltype(int type,
int* oldtype); 参数:
type:将取消的类型设置为type
oldtype:将该线程的取消类型放到oldtype所指向的空间里面 返回值:
成功返回0,失败返回错误码
我们默认的取消类型是推迟取消。也就是会运行到取消点再取消
对于可以设置的取消类型有PTHREAD_CANCEL_DEFERRED(推迟取消),也就是默认的取消类型。
PTHRAED_CANCEL_ASYNCHRONOUS(异步取消),采用异步取消之后,线程可以在任意时间取消,不是非得到取消点才可以取消。
5. pthread_testcancel
- 对于一个线程没有调用上面说的可以产生取消点函数,那么该线程就没有取消点,也就无法被取消,取消请求也就会一直挂起,不会被线程处理。
- 所以如果要对线程进行取消请求的话,可以自己给线程加上取消点
- pthread_testcancel函数就可以在程序自己加上取消点。
#include <thread.h>
void pthread_testcancel(void);
调用pthread_testcancel函数,如果有某个取消请求正处于挂起状态的话,而且取消并没有被设置为无效,那么该线程就会立即被取消。但是,如果取消被设置为无效的话,那么pthread_testcancel函数调用就没与效果了。