免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 664 | 回复: 0
打印 上一主题 下一主题

线程:终止 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-08 00:49 |只看该作者 |倒序浏览

               
p, li { white-space: pre-wrap; }
2008-08-07 20:03 线程_终止
线程的终止有三种形式:
线程从线程函数中执行完代码,返回。线程被同一进程中其他线程取消。线程调用pthread_exit。
void pthread_exit(void* rval_ptr); 中rval_ptr可以被pthread_join获取,以获得线程的退出状态。需要注意的是rval_ptr这个参数必须在调用时是有效的,即其不能随线程的exit而变得无效。线程被同一进程其他线程取消, 例:cancel_thread.c在线程中设置允许取消(默认是允许取消的)。pthread_setcancelstate(int state, int* oldstate); state是“可取消状态”值为:PTHREAD_CANCEL_ENABLE和PTHREAD_CANCEL_DISABLE,oldstate存储设置之前线程的“可取消状态”。取消可分延时取消(默认)和异步取消,异步取消时线程可随时取消,延时取消时线程在“取消点”可被取消。设置取消类型函数:pthread_setcanceltype(int type, int* oldtype); type是取消类型, 值为:PTHREAD_CANCEL_DEFERRED(延时取消)和PTHREAD_CANCEL_ASYNCHRONOUS(异步取消);oldtype存储设置之前线程的取消类型。取消点:是线程检查是否被取消并按照请求进行动作的一个位置。在延迟取消时,线程在取消请求发出后继续运行,直到线程到达某个取消点。POSIX.1取消点定义(UNIX环境高级编程:P332 表12-7,P333 表12-8)。可以自己添加取消点:void pthread_testcancel(void),使用见例子。线程退出时的消除动作:线程清理处理程序。需要在线程开始时进行注册,在线程退出时以“逆序”执行(因为是放在栈里面)。例:clean_up_thread.c
注册:pthread_cleanup_pop(void (*rtn)(void *), void *arg),rtn清理函数名,arg需要传入的参数清理:pthread_cleanup_push(int execute),execute是否执行,0:不执行,其他:执行清理的三个开始点:调用pthread_exit时;响应取消请求时;用非0调用 pthread_cleanup_push时。code:
/** cancel_thread.c */
/** debian 下编译通过 */
#include
#include
#include
#include
void* thr_fn1(void* arg)
{
    /** 设置线程可被取消, 默认 */
    //pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    /** 设置线程不可被取消 */
    //pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
   
    /** 设置线程延迟取消, 默认*/
    //pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
   
    /** 设置线程异步取消*/
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    while(1) {
        //; //在延迟取消时,无法取消
        printf("thead 1 running\n"); //系统定义取消点
        //sleep(1);    //系统定义取消点
        //pthread_testcancel(); //设置自己的取消点
    }
    printf("thead 1 exit\n");
    return (void *)0;
}
int main(int argc, char** argv)
{
    pthread_t tid1;
    int err, *ret;
    char cmd;
    err = pthread_create(&tid1, NULL, thr_fn1, NULL);
    if (err != 0) {
        printf("can't create thread 1: %s", strerror(err));
        return 1;
    }
   
    scanf("%c", &cmd);
    while(cmd != 'q') {
        if (cmd == 'k') {
            err = pthread_cancel(tid1);
            if (err != 0) {
                printf("cancel thread error: %s\n", strerror(err));
                return 1;
            }
            
            err = pthread_join(tid1, (void *)&ret);
            if (err != 0) {
                printf("thread join error: %s\n", strerror(err));
                return 1;
            }
            printf("thread 1 return: %d\n", ret);
            return 0;
        }
        scanf("%c", &cmd);
    }
    return 0;
}
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/75577/showart_1117203.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP