异步取消线程

2007阅读 0评论2010-12-03 shenhailuanma
分类:LINUX

有两个线程属性并没有包含在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);
}


上一篇:linux下 线程私有数据
下一篇:Linux下getsockopt/setsockopt 函数说明