pthread_detach函数

2023-11-13

        线程分离状态:指定该状态,线程主动与主控线程断开关系。使用pthread_exit或者线程自动结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。

        进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。

        也可使用 pthread_create函数参2(线程属性)来设置线程分离。pthread_detach函数是在创建线程之后调用的。

  • 函数描述:实现线程分离
  • 函数原型:int pthread_detach(pthread_t thread);
  • 函数返回值:成功:0;失败:错误号

         一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

以一个例子引入:编写程序,在创建线程之后设置线程的分离状态。

说明:如果线程已经设置了分离状态,则再调用pthread_join就会失败,可用这个方法验证是否已成功设置分离状态。

 代码如下:

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;

//线程执行函数
void *mythread(void *arg)
{
        cout << "child thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
        sleep(10);
}

int main()
{
        //int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    //                      void *(*start_routine) (void *), void *arg);
        //创建子线程
        pthread_t thread;
        int ret = pthread_create(&thread, NULL, mythread, NULL);
        if(ret!=0)
        {
                cout << "pthread_create error, " << strerror(ret) << endl;
                return -1;
        }
        cout << "main thread, pid==" << getpid() << ", id==" << pthread_self() << endl;

        //设置线程为分离属性
        pthread_detach(thread);

        //子线程设置分离属性,则pthread_join不再阻塞,立刻返回
        ret = pthread_join(thread, NULL);
        if(ret!=0)
        {

                cout << "pthread_join error, " << strerror(ret) << endl;
        }

        //目的是为了让子线程能够执行起来
        sleep(1);
        return 0;
}

也可以利用pthread_create的第二个参数设置分离属性,部分核心代码如下:

int main()
{
        //定义pthread_attr_t类型的变量
        pthread_attr_t attr;

        //初始化attr变量
        pthread_attr_init(&attr);

        //设置attr为分离属性
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

        //创建子线程
        pthread_t thread;
        int ret = pthread_create(&thread, &attr, mythread, NULL);
        if(ret!=0)
        {
                cout << "pthread_create error, " << strerror(ret) << endl;
                return -1;
        }
        cout << "main thread, pid==" << getpid() << ", id==" << pthread_self() << endl;

        //释放线程属性
        pthread_attr_destroy(&attr);

        //验证子线程是否为分离属性
        ret = pthread_join(thread, NULL);
        if(ret!=0)
        {
                cout << "pthread_join error, " << strerror(ret) << endl;
        }

        return 0;
}

运行结果如下:成功的设置了分离属性,调用pthread_jion失败

        

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pthread_detach函数 的相关文章

随机推荐

  • 什么是前端(js)路由器

    概述 路由器是WebApp应用程序切换页面的枢纽 早起由于浏览器处理JS脚本的能力较弱 大部分逻辑和交互都在服务端完成 因此路由器这个词最早出现服务端 服务端通过客户端请求的URL解析出需要返回给客户端的HTML文档的路径 最终返回相对应H
  • 使用恒源云训练k210和v831模型

    使用恒源云训练k210和v831模型 因为在训练本地模型时 环境搭建容易出各种bug 费时费力 而恒源云上有大佬搭建浩的环境可以直接使用 所以记录一下我使用的流程 这是大佬视频链接 非常牛批 1 注册恒源云账号 首先直接在浏览器上搜索恒源云
  • Linux如何运行.Applmage文件

    1 什么是 Applmage文件 AppImage是新型的打包软件 它可以解决Linux上面的依赖问题 在使用上面相比其他的软件使用极为简单 所谓的 Applmage文件就是使用该打包软件打包出来的文件格式 2 怎么运行 Applmage文
  • html边框渐变颜色代码,css中如何实现border边框颜色渐变代码详解

    在css中 如果一条边框线有n像素的宽度 那么就可以对其设置n种不同的颜色 在代码中 我们可以定义一条宽为7px的实线 border 7px solid C8C8C8 不要在意此处设置的颜色 在firefox中后面的代码中会被新设置的颜色覆
  • C#中委托和事件

    目 录 1 1 理解委托 2 1 1 1 将方法作为方法的参数 2 1 1 2 将方法绑定到委托 4 1 2 事件的由来 6 1 2 1 更好的封装性 6 1 2 2 限制类型能力 9 1 3 委托的编译代码 10 1 4 NET 框架中的
  • python json.load与json.loads区别

    文章目录 json loads 与json load区别 json load示例 json loads示例 json loads 与json load区别 stackoverflow上的一个提问 In Python what is the
  • Windows下载安装redis

    Windows 安装Redis 64位下载地址 https github com microsoftarchive redis releases tag win 3 2 100 下载64位解压 启动redis 命令行 redis serve
  • MATLAB 的循环语句

    1 MATLAB while循环语法 在MATLAB 中 while循环的语法如下 while
  • 星星之火-24: 3G CDMA中为什么要把1转换成+1,0转换成-1才进行扩频与码分多址运算?+1,-1转换的本质是什么?

    扩频运算 宏观上看 是把一个比特的0或1 扩展成8比特 起到了扩频的效果 从效果上理解扩频 没有多大的问题 但为什么要把预先把1转换成 1 0转换成 1才能运算 1 1转换的本质是什么 不要小看这个不起眼的转换 它涉及到数字无线通信中的一个
  • 测试点击屏幕次数的软件_最新5G测试软件FAT详细介绍(包含锁频锁网锁PCI、信令/事件查看等功能)...

    推荐一款适用于高通芯片的4 5G网优测试APP FAT 推荐原因 界面简洁 操作简单 方便快捷 而且可以锁网锁频段和查看信令 1 打点测试 除Speedtest外 Attach Volte Ping FtpUp和FtpDown都可以打点测试
  • mongodb安装

    MongoDB安装 MongoDB下载 下载链接 https www mongodb com download center community 打开下载得到的文件 一直next 接下来一路next 等待安装完成 安装完成
  • ElementUI DatePicker直接赋值回显后,无法更改与删除问题

    前言 使用vue ElementUI 开发项目时 使用到e date picker组件选择日期范围dateRange 当默认dateRange直接赋值后 导致组件内回显的值无法删除且也无法修改 解决方案 setTemp 直接使用下列方式直接
  • Java中BigDecimal详解

    引言 Effective Java 一书中提到 float和double类型主要是为了科学计算和工程计算而设计的 它们执行二进制浮点数运算是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的 然而 它们并没有提供完全精确的结果 先
  • 详解JS原型与原型链

    目录 1 构造函数原型prototype 2 对象原型 proto 3 constructor构造函数 4 原型链 5 原型对象中的this指向 6 扩展内置对象 原型对象的应用 在ES6之前 我们面向对象是通过构造函数实现的 我们把对象的
  • 巨无霸Win8PE X64服务器维护专用,【13年4月4日】维护版win8pe【32位+64位+纯64位】(支持BIOS+EFI)...

    因为单独一个PE是不够用的 已经制作了合盘 可BIOS启动 也可EFI启动 详情移步 欢迎下载使用 觉得好的话 请回帖支持一下 您的支持 就是我的动力 预祝大家新的一年合家欢乐 工作顺利 不定期更新 感谢支持
  • 数据库计算机三级等级考试--数据库技术相关知识点和笔记

    数据库计算机三级等级考试 数据库技术 计算机三级等级考试笔记 是博主通过计算机三级数据库技术考试的相关笔记 此篇博客 不仅适合需要考计算机三级考试的各位考生 也适合在职场处理关于数据库的部分操作 个人认为算是一篇使用性比较强的文档 我个人认
  • Tomcat配置文件信息泄露

    是由于server xml内的appBase置空导致
  • 苹果即将推出的共享表情图案2020将被添加到iPhone手机,ipad的预览

    明天 7月17日 是世界表情包日 World Emoji Day 苹果为庆祝这一节日 将推出的共享表情图案2020添加到iPhone手机 ipad的预览当中 2020年发布的表情符号是表情符号13更新的一部分 其中包括以下表情符号选项 面孔
  • Linux—使用readelf工具查看程序代码变量的内存空间布局情况

    1 源程序与程序的映射 BSS段 存放未初始化的全局变量或静态变量 Block Started by Symbol DATA段 存放已初始化的变量 TEXT段 存放二进制代码 2 程序到进程的映射 程序代码区 存放函数体二进制代码 常量区
  • pthread_detach函数

    线程分离状态 指定该状态 线程主动与主控线程断开关系 使用pthread exit或者线程自动结束后 其退出状态不由其他线程获取 而直接自己自动释放 网络 多线程服务器常用 进程若有该机制 将不会产生僵尸进程 僵尸进程的产生主要由于进程死后