设置线程分离态


前言

        默认情况下,线程是可连接的(结合态),也就是说,当线程退出时,其他线程可以通过调用pthread_join()函数获取其返回状态,通过pthread_join()实现线程之间的通信。

        但有时,在编程过程中,程序并不关心线程的返回状态,只是希望系统在线程终止时能够自动清理并移除。在这种情况下,可以调用pthread_detach()函数并向thread参数传入指定线程的标识符,将该线程标记为处于分离状态(分离态


一、pthread_detach()函数

函数:

#include <pthread.h>

int pthread_detach(pthread_t thread);

参数:线程的标示符

        一旦线程处于分离状态,就不能再使用pthread_join()函数来获取其状态,也无法使其重返“可连接”状态

例:

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

void *thread_one(void * arg)
{
    int i;
    long t2;
    long result=0;
    sleep(3);
    t2=(long)arg;
    for (i = 0; i <= t2; i++)
    {
        result=result+i;
    }
    printf("threadone arg is %ld  pthread_exit!\n",t2);
    pthread_exit((void *)result);
    //return (void *)result;//效果与pthread_exit((void *)result)一样
}

int main(int arg,char ** argv)
{
    int res,rc;
    pthread_t thread;
    long t=100;
    long result2;
    rc = pthread_create( &thread,NULL,thread_one,(void *)t);
    pthread_detach(thread);//设置线程分离
    if(rc) printf("create error \n");
    sleep(4);//延时,让thread_one先执行
    void * thread_result;
    res = pthread_join(thread,&thread_result);//等待线程结束,接收线程的返回值存储在thread_result中
    //if(res) printf("join error \n");
    result2=(long)thread_result;
    if(res==0) //pthread_join成功返回值为0
    {
    printf("this is result %ld\n",result2);
    }
}

运行结果:

         从结果可以看出,即使在程序中调用了pthread_join()函数去接收线程的返回值,但由于在pthread_join()前面调用了pthread_detach()函数,将线程设置为分离态,pthread_join()失效

二、pthread_attr_setdetachstate实现线程分离

        设置线程分离状态,也可以在线程刚一创建时即进行分离(而非之后再调用pthread_detach()函数),这主要是对创建线程的第二个参数就行配置

步骤:

1.声明变量:

pthread_attr_t attr;

2.采用默认的方式对线程属性结构进行初始化:

pthread_attr_init(pthread_attr_t *attr);

3.为创建分离线程而设置属性

pthread_attr_setdetachstate();

函数原型:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

参数detachstate用来设置线程的状态,设置PTHREAD_CREATE_DETACHED(分离态)PTHREAD_CREATE_JOINABLE(结合态)

4.创建线程:

pthread_create( &thread,&attr,thread_one,(void *)t);

5.摧毁属性对象:

pthread_attr_destroy(pthread_attr_t *attr);

注:线程创建函数函数原型:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

在声明第二个变量时,不采取声明其为一个指针,只是在后面传参时取地址

具体看上面的声明变量和创建线程时我的做法

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

void *thread_one(void * arg)
{
    int i;
    long t2;
    long result=0;
    sleep(3);
    t2=(long)arg;
    for (i = 0; i <= t2; i++)
    {
        result=result+i;
    }
    
    printf("threadone arg is %ld  pthread_exit!\n",t2);
    //pthread_exit((void *)result);
    return (void *)result;//效果与pthread_exit((void *)result)一样
}

int main(int arg,char ** argv)
{
    int res,rc;
    pthread_t thread;
    long t=100;
    long result2;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    rc = pthread_create( &thread,&attr,thread_one,(void *)t);
    pthread_attr_destroy(&attr);
    //pthread_detach(thread);
    if(rc) printf("create error \n");
    sleep(4);//延时,让thread_one先执行
    void * thread_result;
    res = pthread_join(thread,&thread_result);//等待线程结束,接收线程的返回值存储在thread_result中
    //if(res) printf("join error \n");
    result2=(long)thread_result;
    if(res==0) //pthread_join成功返回值为0
    {
    printf("this is result %ld\n",result2);
    }
}

运行结果和使用pthread_detach()函数实现线程分离一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香菜是个好东西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值