pthread_detach函数

2023-11-12

int pthread_detach(pthread_t thread);    成功:0;失败:错误号

作用:从状态上实现线程分离,注意不是指该线程独自占用地址空间。

线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后(不会产生僵尸线程),其退出状态不由其他线程获取,而直接自己自动释放(自己清理掉PCB的残留资源)。网络、多线程服务器常用。

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

也可使用 pthread_create函数参2(线程属性)来设置线程分离。

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

//使用pthread_detach函数实现线程分离

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

void *tfn(void *arg)
{
        int n = 3;

        while (n--) {
                printf("thread count %d\n", n);
                sleep(1);
        }

        //return (void *)1;
    pthread_exit((void *)1);
}

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

#if 0

        pthread_attr_t attr;            /*通过线程属性来设置游离态(分离态)*/
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        pthread_create(&tid, &attr, tfn, NULL);

#else

        pthread_create(&tid, NULL, tfn, NULL);
        pthread_detach(tid);         //让线程分离  ----自动退出,无系统残留资源

#endif

        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;
}

[root@localhost 01_pthread_test]# ./pthrd_detach

-------------err= 22       //可见错误号是22

thread count 2

thread_join error: Invalid argument  //错误号对应的详细解释

thread count 1

-------------err= 22

thread_join error: Invalid argument

-------------err= 22

thread count 0

thread_join error: Invalid argument

-------------err= 22

thread_join error: Invalid argument

-------------err= 22

thread_join error: Invalid argument

分析:

  1. 使用pthread_detach函数实现线程分离时,应当先创建线程(pthread_create),然后再用pthread_detach实现该线程的分离。因此,这种方式与修改线程属性来实现线程分离的方法相比,不会发生在线程创建函数还未来得及返回时子线程提前结束导致返回的线程号是错误的线程号的情况。因为采用这种方法,即使子线程提前结束(先于pthread_create返回),但是子线程还未处于分离状态,因此其PCB的残留信息依然存在,如线程号等一些系统资源,所以线程号等系统资源仍被占据,还未分配出去,所以创建函数返回的线程号依然是该线程的线程号;
  2. 对处于分离状态的线程进行回收,会出现错误,且错误编号为22;
  3. 还可采用修改线程属性的方法来实现线程分离。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pthread_detach函数 的相关文章

  • linux文件编程(4)—— 用ANSIC标准C库函数进行文件编程:fopen、fread、fwrite、fseek

    参考 linux文件编程 5 用ANSIC标准中的C库函数进行文件编程 作者 丶PURSUING 发布时间 2021 04 11 11 58 25 网址 https blog csdn net weixin 44742824 article
  • Linux·网络编程套接字(一)

    目录 预备知识 理解源IP地址和目的IP地址 理解源MAC地址和目的MAC地址 理解源端口号和目的端口号 PORT VS PID 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简
  • Linux·异步IO编程框架

    hi 大家好 今天分享一篇Linux异步IO编程框架文章 对比IO复用的epoll框架 到底性能提高多少 让我们看一看 译者序 本文组合翻译了以下两篇文章的干货部分 作为 io uring 相关的入门参考 How io uring and
  • 10信号学习之signal函数及使用其实现信号捕捉案例

    1 signal函数 功能 该函数注册一个信号捕捉函数 对比上一篇的案例和相关函数 都是针对于信号集操作的 而这个函数是针对处理动作来操作的 你可以利用此函数将捕捉到的信号按自己的方式执行 例如你可以捕捉段错误的信号后执行打印hello w
  • Linux 系统编程--fcntl()读写锁实例

    fcntl 1 功能描述根据文件描述词来操作文件的特性 2 用法 读写锁实例 1 给文件加读锁 2 给文件加写锁 先执行读锁再执行写锁结果如下 先运行写锁再运行读锁的话结果如下 在多进程对同一个文件进行读写访问时 为了保证数据的完整性 有事
  • 文件写入操作编程(Linux系统编程)

    write函数 man手册的相关介绍 代码实现 include
  • ioctl函数详细分析

    IPv4 和 IPv6 的网络接口操作使用套接字 ioctl 命令 级别 中级 Katiyar Manish manish katiyar in ibm com 软件工程师 IBM Intel Microsoft HPShweta Gupt
  • Linux下特有的reboot()函数的简介

    1 Linux下c程序通过调用reboot 函数 可以实现系统的重启 挂机 Power Down等功能 2 1 对于libc5或libc4来说 库函数的原型声明中包含四个参数 具体函数原型声明如下 include
  • [源码解读]深入理解pthread中的condition条件变量

    深入理解pthread中的condition条件变量 文章目录 深入理解pthread中的condition条件变量 pthread cond init c pthread cond wait c pthread cond signal c
  • 父进程等待子进程退出(linux系统编程)

    为什么要等待子进程退出 父进程等待子进程退出并收集子进程退出状态 子进程退出状态不被收集 会变成僵尸进程 举个例子 include
  • 面试官都在问

    面试官都在问 Linux命令之gdb 0 简述 GDB GNU symbolic debugger 简单地说就是一个调试工具 它是一个受通用公共许可证即GPL保护的自由软件 一般来说 GDB主要帮助你完成下面四个方面的功能 1 启动你的程序
  • Linux下进程内存空间组成/进程的内存映像

    http blog csdn net yusiguyuan article details 45155035 http javathinker iteye com blog 1733058 前言 在偏底层的开发中 需要了解程序的是如何存储的
  • 三、Linux系统编程:进程间的通信(IPC)之消息队列

    3 IPC 进程间通信 消息队列 消息队列 Message queue 是一种进程间通信或同一进程的不同线程间的通信方式 软件的贮列用来处理一系列的输入 通常是来自用户 3 1 背景 管道和套接字比较适合两三个进程之间的通信 如果进程成倍增
  • Linux进程的讲解(僵尸进程、孤儿进程)

    进程 程序就是你编译过后产生的那个文件 进程就是打开程序过后产生的 fork vfork exit execl system popen 孤儿进程 僵尸进程 wait fork1 getpid getppid区别 pid t getpid
  • Linux工具——gcc

    目录 一 gcc简介 二 C语言源文件的编译过程 1 预处理 2 编译 3 汇编 4 链接 5 动静态库 一 gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio 其实这个gcc这个编译器实现的功能便是
  • Linux中的软件管家——yum

    目录 编辑 一 软件安装的方式 二 对yum的介绍 1 yum的作用 2 yum的库 三 yum下载软件的操作 1 yum list 2 yum install 3 yum remove 四 yum源的转换 一 软件安装的方式 软件安装的方
  • POSIX线程:API

    一 线程创建与取消 1 线程创建 1 1 线程与进程 相对进程而言 线程是一个更加接近于执行体的概念 它可以与同进程中的其他线程共享数据 但拥有自己的栈空间 拥有独立的执行序列 在串行程序基础上引入线程和进程是为了提高程序的并发度 从而提高
  • 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU 它承担了所有的计算任务 而操作系统是计算机的管理者 它负责任务的调度 资源的分配和管理 统领整个计算机硬件 应用程序是具有某种功能的程序 程序是运行于操作系统之上的 2 进程 我们编写的代
  • 【hello Linux】进程间通信——共享内存

    目录 前言 1 System V共享内存 1 共享内存的理解 2 共享内存的使用步骤 3 共享内存的使用 1 共享内存的创建 查看共享内存 2 共享内存的释放 3 共享内存的挂接 4 共享内存的去挂接 4 共享内存的使用示例 1 两进程挂接
  • 03LinuxC线程学习之线程共享和非共享

    1 线程共享和非共享 1 1 线程共享资源 1 文件描述符表 由于线程间共享进程间的内容 而文件描述符表在主线程的PCB当中 各个线程可以直接去请求访问 所以线程间通信就不需要像进程那样通过管道这些方式通信 2 每种信号的处理方式 即当某个

随机推荐

  • Openwrt编译python3时出现错误:No rule to make target `package//host/compile'

    步骤 1 在package目录下添加python3 包含Makefile files和相关patches文件 2 执行make package python3 compile V s make 1 No rule to make targe
  • 纯css3制作手风琴选项卡

    前言 平时工作中时常会制作手风琴以及选项卡 制作这些我们首先想到的是使用 js 操作 而其实 css3 也是可以完成 不需要使用 js 下面我们就使用 css3 完成 效果如下 手风琴 结构代码如下 ul class box li li u
  • 美团-分布式会话跟踪系统架构设计与实践

    前言 随着美团点评的业务发展 公司的分布式系统变得越来越复杂 我们亟需一个工具能够梳理内部服务之间的关系 感知上下游服务的形态 比如一次请求的流量从哪个服务而来 最终落到了哪个服务中去 服务之间是RPC调用 还是HTTP调用 一次分布式请求
  • Hibernate中用hql查询部分字段

    hql查询单表部分字段 在hibernate中 用hql语句查询实体类 采用list方法的返回结果为一个List 该List中封装的对象分为以下三种情况 1 查询全部字段的情况下 如 from 实体类 list中封装的对象为实体类本身 各属
  • 如何禁用GeForce Experience的奖励广告

    NVIDIA s GeForce Experience software now displays notification advertisements for free to play games If you don t want n
  • 系统错误!!!VCRUNTIME140.dll找不到的解决方案

    相信各位很多一定有过这样的经历 当你打开steam 打算开开心心玩一场游戏 当你打开电脑 想登个QQ 然后 太淦了 对不对 笔者百度了一下 教程挺多 不过试试我的也是可以的 至少我觉得简单实用吧 而且以后电脑软件有什么小毛病都可以试试 通过
  • 使用百度API进行情感分析(python)(二)

    编写代码 将代码中的token值改为上一篇得到的Access token值 即可 该值的时间期限约是一个月 一个月之后需要重新获取Access token值 获取方法与之前相同 代码示例 import re import requests
  • 基于.Net的权限管理快速开发框架

    一 项目简介 基于 Net的权限管理快速开发框架 二 实现功能 支持基础功能 系统设置 角色管理 用户管理 组织机构 字典管理 支持功能模块 权限管理 url权限 按钮权限 支持定时任务 在线的定时任务 任务调度 执行结果 支持基本的日志管
  • C++实例(十二)图形绘制

    一 特殊曲线 绘制蜗牛线 绘制贝塞尔曲线 拖动绘制曲线 绘制正弦曲线 绘制立体模型 交叉线条 绘制尼哥米德蚌线 艺术图案万花筒 绘制抛物线 等电位面图 沙丘图案 绘制艺术图案 立体三棱锥 二 图形基础 创建不同的画刷 指定颜色填充矩形区域
  • 更多提高正则表达式效率的方法

    原文 http wyzws iteye com blog 1274020 让匹配更快失败 尤其是匹配很长的字符串时 匹配失败的位置要比成功的位置多得多 以简单 必须的字元开始 排除明显不匹配的位置 如锚点 或 特殊字符 x或 u263A 字
  • win32 消息循环

    windows系统把应用程序的输入事件传递给各个窗口 每个窗口有一个函数 称为窗口消息处理函数 窗口消息处理函数处理各种用户输入 处理完成后再将控制权交还给系统 窗口消息处理函数一般是在注册一个窗口的时候指定的 在Windows下 只有那些
  • linear-gradient为啥只能background不能background-color

    background 可以设置 背景颜色 背景图片 定位等 而background color 只能设置 背景颜色 设置background color aaa 此时仅仅改专变了背景色 但此时有一个默认的的background repeat
  • 什么是OAuth

    什么是OAuth OAuth 全称 Open Authorization 中文翻译开放授权 是一种基于令牌的身份验证 允许组织跨第三方服务共享信息 而无需公开用户的用户名 密码 本质上 OAuth是为第三方服务提供令牌的中间人 该令牌只允许
  • android按日期函数查询,Android开发中SQLite存储时间和按日期函数查询

    Android开发中SQLite存储时间和按日期函数查询 Android开发中SQLite存储时间和按日期函数查询 在Android开发中 在消息模块中 消息做数据库缓存处理 排序查询或指定时间查询需要用时间和日期函数 本篇简括 存储时间字
  • QT 完美实现圆形按钮

    QT 版本 5 6 0 官方的按钮有些普通 如果我们想要换成自己喜欢的按钮而却无从下手 那么请继续往下阅读 皮一下 首先 可以在网络上搜索一下自己喜欢的按钮图形 或者可以自行绘制 我以下面的图形为例 开始制作 一 建立 QT 工程 并加入图
  • 基于画布canvas进行图片压缩

    Canvas 压缩图片的原理主要是通过重新绘制图片 调整图片质量或大小来达到压缩图片的目的 具体实现步骤如下 1 使用 JavaScript 中的 Image 对象将图片加载到内存中 var img new Image img src im
  • mkp勒索病毒怎么处理

    目录 前言 简介 一 mkp勒索病毒的特征 二 mkp后缀勒索病毒是如何传播的 三 如何预防与处理mkp勒索病毒攻击 前言 简介 当今 勒索病毒已成为企业网络安全的一大威胁 而其中mkp勒索病毒则是一种新近出现的变种 与其他勒索病毒一样 m
  • 关于redis密码

    如何更改密码 直接配置文件里更改 配置文件里开放 requirepass 之后客户端更改 用Redis命令查询密码 可以使用以下Redis命令来查询密码 config get requirepass 得到的结果第一行固定是requirepa
  • 设计模式-备忘录模式(Memento Pattern)

    文章目录 前言 一 备忘录模式的概念 二 备忘录模式的实现 三 备忘录优缺点 优点 缺点 总结 前言 备忘录模式 Memento Pattern 是一种行为型设计模式 它用于捕获和存储对象的内部状态 以便在以后可以恢复到先前的状态 备忘录模
  • pthread_detach函数

    int pthread detach pthread t thread 成功 0 失败 错误号 作用 从状态上实现线程分离 注意不是指该线程独自占用地址空间 线程分离状态 指定该状态 线程主动与主控线程断开关系 线程结束后 不会产生僵尸线程