线程终止

 

pthread_detach函数

1. 函数原型:分离线程

int pthread_detach(pthred_t thread);

                                    返回值:若成功,返回0,否则,返回错误编号
  • 线程分离状态:指定该线程‘线程主动与主控线程断开关系,线程结束后,其退出状态不由其他线程获取,而直接自己主动释放,网络、多线程服务器常用。
  • 进程若有该机制,将不会产生僵尸进程,僵尸进程的产生主要是由于进程死后,大部分资源被释放,一点残留资源仍然存于系统中,导致内核认为该进程仍然存在。
  • 也可以用pthread_create函数参数2(线程属性)来设置线程分离。

 

2. 测试代码:

#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<stdio.h>

void *tfn(void *arg)
{
    int n = 3;
    while(n--) {
        printf("thred count %d\n", n);
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    void *tret;
    int err;

    pthread_create(&tid, NULL, tfn, NULL);
    pthread_detach(tid);

    while(1) {
        err = pthread_join(tid, &tret);
        printf("-----------------------err = %d\n", err);
        if(err != 0) 
            fprintf(stderr, "thread_join error: %s\n", strerror(err));
        else 
            fprintf(stderr, "thread_exit code %d\n", (int) tret);
            sleep(1);
    }
    return 0;
}

输出结果:

 

测试代码:

#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<stdio.h>
 
void *tfn(void *arg)
{
    int n = 3;
    while(n--) {
        printf("thred count %d\n", n);
        sleep(1);
    }
}
 
int main()
{
    pthread_t tid;
    void *tret;
    int err;
 
    pthread_create(&tid, NULL, tfn, NULL);
 
    while(1) {
        err = pthread_join(tid, &tret);
        printf("-----------------------err = %d\n", err);
        if(err != 0) 
            fprintf(stderr, "thread_join error: %s\n", strerror(err));
        else 
            fprintf(stderr, "thread_exit code %d\n", (int) tret);
            sleep(1);
    }
    return 0;
}

输出结果:

 

二、pthread_cancel函数

功能:杀死(取消)线程

#include<pthread.h。
int pthread_cancel(pthread_t thread);
                                返回值:若成功,返回0, 否则,返回错误

【注意】:线程取消并不是实时的,而有一定的延时, 需要等待线程到达某个取消点(检查点)

类似玩游戏存档,必须达到指定的场所(存档点, 如:客栈、仓库、城里等)才能存储进度。杀死线程也不是立刻就能完成 ,必须到达取消点。

取消点:是线程检查是否被取消,并按请求进行工作的一个位置。通常是一个系统调用creat,open、pause、close、read、write执行命令man 7 pthreads可以查看具备这些取消点的系统调用列表。

可以粗略认为一个系统调用(进入内核)即为一个取消点。如线程中没有取消点,可以通过调用pthread_testcancl函数自行设置一个取消点。

被取消的线程,退出值定义在Linux的pthread库中,常数PTHREAD_CANCELED的值是-1,可在头文件pthread.h中找到它的定义:#define PTHREAD_CANCELED((void*) -1),因此当我们对一个已经被取消的线程使用pthread_join会回收时,得到的返回值为-1。

 

1. 测试代码:

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>

void *tfn1(void *arg)
{
    printf("thread 1 returning\n");
    return  (void*) 111;
}

void *tfn2(void *arg)
{
    printf("thread 2 exiting\n");
    pthread_exit((void *) 222);
}


void *tfn3(void *arg)
{
    while(1) {
        printf("thread 3: I'm going to die in 3 seconds ....\n");
        sleep(1) ;
    }

    return (void*) 666;
}

int main()
{
    pthread_t tid;
    void *tret = NULL;

    pthread_create(&tid, NULL, tfn1, NULL);
    pthread_join(tid, &tret);
    printf(" thread 1 exit code = %d\n\n", (int)tret);
    
    pthread_create(&tid, NULL, tfn2, NULL);
    pthread_join(tid, &tret);
    printf(" thread 2 exit code = %d\n\n", (int)tret);

    pthread_create(&tid, NULL, tfn3, NULL);
    sleep(3);
    pthread_cancel(tid);
    pthread_join(tid, &tret);
    printf("thread 3 exit code = %d\n", (int)tret);

    return 0;
}

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值