Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1485051
  • 博文数量: 181
  • 博客积分: 3308
  • 博客等级: 中校
  • 技术积分: 2227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-03 12:03
个人简介

我是zoro

文章分类

全部博文(181)

文章存档

2015年(1)

2013年(35)

2012年(39)

2011年(50)

2010年(56)

分类: LINUX

2010-12-03 22:21:19

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


阅读(2023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~