有两个线程属性并没有包含在pthread_attr_t结构中,它们是 可取消状态 和 可取消类型。这两个属性影响着线程在相应pthread_cancel函数调用时所呈现的行为。
可取消状态属性可以是PTHREAD_CANCEL_ENABLE(默认),也可以是PTHREAD_CANCEL_DISABLE。线程可通过调用pthread_setcancelstate修改它的可取消状态。
int pthread_setcancelstate(int state, int *oldstate);
返回值:若成功返回0,否则返回错误编号。
注意:在默认情况下,线程在取消请求发出以后还是继续运行,直到线程到达某个取消点。
调用pthread_testcancel函数,自己添加取消点。(其实还是很被动的办法。。。)
int pthread_setcancelstate(int state, int *oldstate);
其实,默认情况下,取消类型为延迟取消(PTHREAD_CANCEL_DEFERRED),在调用pthread_cancel后,在未达到取消点之前,并不会真正取消。可以通过调用pthread_setcanceltype来修改取消类型为异步取消(PTHREAD_CANCEL_ASYNCHRONOUS)。使用异步取消,线程可以在任意时间取消,不必遇到取消点才能被取消。
int pthread_setcanceltype(int type, int *oldtype);
返回值:若成功返回0,否则返回错误编号。
测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void * thread_handler(void * arg)
{
int oldstate, oldtype;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
if (oldstate == PTHREAD_CANCEL_ENABLE)
printf("thread default enable canceled!\n");
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,
&oldtype);
if (oldtype == PTHREAD_CANCEL_DEFERRED)
printf("thread cancel defferred!\n");
long long i = 0;
int k;
for (k = 0; k < 10; k++) {
while (1) {
i++;
if (i == 999999999)
break;
//pthread_testcancel();
}
i = 0;
if (k == 2)
sleep(1);
}
printf("thread over!\n");
return NULL;
}
int main(void)
{
pthread_t tid;
int ret;
char c;
ret = pthread_create(&tid, NULL, thread_handler, NULL);
if (ret) {
printf("pthread_create:%s\n", strerror(ret));
exit(1);
}
while (1) {
printf("Input d cancel the thread!\n");
scanf("%c", &c);
if (c == 'd') {
ret = pthread_cancel(tid);
if (ret) {
printf("pthread_cancel:%s\n",
strerror(ret));
exit(1);
}
break;
}
}
pthread_exit(NULL);
}
|