linux下线程分离属性

linux下线程分离属性

  • 一、线程的属性---分离属性
  • 二、线程属性设置
    • 2.1 线程创建前设置分离属性
    • 2.2 线程创建后设置分离属性

一、线程的属性—分离属性

什么是分离属性?
首先分离属性是线程的一个属性,有了分离属性的线程,不需要别的线程去接合自己的(回收自己的资源)。
a.线程的分离属性有两种:分离态(detached)和非分离态(joinable)。

b.非分离态的线程只有在调用pthread_join之后才会完全释放自己所占用的资源,可以用pthread_detach函数将线程修改为分离态,分离态的线程在线程结束后由系统自动释放其所占用的所有资源;
c.线程创建后默认属性是非分离态,需要调用pthread_join释放线程所占用的资源;

但是虽然说是分离的,但是进程退出了,该线程还是会退出的。
总结:
设置了分离属性的线程 -> 不需要pthread_join()
设置了非分离属性的线程 -> 需要pthread_join() -> 默认创建的普通属性线程就是非分离线程。
退出进程,所有子线程都会消亡,系统会回收他们资源。

如果设置为非分离属性的线程,且不去回收子线程资源,那么一个进程创建的子线程数据是有限,请下面程序(环境ubuntu20.04 64位)

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>//定义退出的值为全局变量
int retval = 10;//子线程
void *start_pthread(void *arg)
{int cnt = 0;printf("arg:%ld\n", *((unsigned long *)arg));}int main(void)
{int cnt = 0;unsigned long val = 0;pthread_t  thread_id;//主线程 运行时间比子线程时间长,主线程运行退出后,回收子线程资源while (1){//线程创建 非分离int ret = pthread_create(&thread_id, NULL, start_pthread, &val);if(ret != 0){printf("pthread_create fail\n");return -1;}    val++;}printf("接合子线程成功\n");return 0;}

运行效果
在这里插入图片描述

如果不设置为分离属性(主不回收子线程资源),创建到32749条时,创建线程失败

二、线程属性设置

线程属性设置通常有两个种,一种是在创建前设置好分离属性,别一个种是线程运行后,再设置线程属性接下来先看第一种情况。

2.1 线程创建前设置分离属性

线程创建前设置分离属性就是添加一个分离属性到一个属性变量中,然后使用属性变量去创建一个线程,那么创建出来的线程就是具有分离属性的线程。
接下来看函数

1)定义一个属性变量 -> 数据类型:pthread_attr_t

pthread_attr_t attr;

2)初始化属性变量。 -> pthread_attr_init() -> man 3 pthread_attr_init

#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);

参数:
attr:未初始化的属性变量
返回值:
成功:0
失败:非0错误码
3)设置分离属性到属性变量中。

#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

参数:
attr:已经初始化过的属性变量
detachstate:
PTHREAD_CREATE_DETACHED -> 分离属性
PTHREAD_CREATE_JOINABLE -> 非分离属性 等同于 pthread_create(&thread_id, NULL, start_pthread, &val);
返回值:
成功:0
失败:非0错误码
4)使用属性变量去创建一个新的线程。

pthread_create(&tid,&attr,.....);   -> 创建出来的线程就是分离属性的线程,不需要pthread_join()

5)销毁属性变量。 -> pthread_attr_destroy() -> man 3 pthread_attr_destroy

int pthread_attr_destroy(pthread_attr_t *attr);

参数:
attr:已经初始化过的属性变量
返回值:
成功:0
失败:非0错误码

案例代码

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>//定义退出的值为全局变量
int retval = 10;//子线程有分离--不需要接合
void *start_pthread(void *arg)
{int cnt = 0;printf("arg:%ld\n", *((unsigned long *)arg));}int main(void)
{int cnt = 0;unsigned long val = 0;pthread_t  thread_id;//定义分享属性变量 pthread_attr_t attr;//初始化属性变量pthread_attr_init(&attr);//设置线程属性--分离属性pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//主线程 运行时间比子线程时间长,主线程运行退出后,回收子线程资源while (1){//线程创建 分离属性int ret = pthread_create(&thread_id, &attr, start_pthread, &val);if(ret != 0){printf("pthread_create fail\n");return -1;}    val++;}printf("接合子线程成功\n");return 0;}

在这里插入图片描述
分离属性后的线程,可以自动消亡,主线程可以无限创建子线程。

2.2 线程创建后设置分离属性

先创建一个普通线程(分享属性设置为NULL, 默认的分享属性为不分离),然后在线程中调用一个设置分离属性的函数,那么这个线程就变成分离的属性。
1)设置线程本身的属性为分离属性。 -> pthread_detach() -> man 3 pthread_detach

#include <pthread.h>
int pthread_detach(pthread_t thread);

函数作用:
设置分离属性给线程
参数:
thread:需要设置分离属性的线程的ID号
返回值:
成功:0
失败:非0错误码
2)获取线程的ID号。 -> pthread_self() -> man 3 pthread_self

#include <pthread.h>
pthread_t pthread_self(void);

参数:

返回值:线程的ID号。

案例

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>//子线程
void *start_pthread(void *arg)
{int cnt = 0;//获取线程IDpthread_t thread_id = pthread_self();//分离线程int ret = pthread_detach(thread_id);if(ret != 0){printf(" pthread_detach fail\n");exit(0);}printf("arg:%ld\n", *((unsigned long *)arg));}int main(void)
{unsigned long val = 0;pthread_t  thread_id;//主线程 运行时间比子线程时间长,主线程运行退出后,回收子线程资源while (1){//线程创建 默认为非分离int ret = pthread_create(&thread_id, NULL, start_pthread, &val);if(ret != 0){printf("pthread_create fail\n");return -1;}    val++;}return 0;}

在这里插入图片描述
设置了分离属性之后,子线程可以无限被创建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见通信协议及其端口号

1. TCP/IP协议族&#xff1a; •HTTP (超文本传输协议): 默认端口 80&#xff0c;用于网页浏览和数据传输。 •HTTPS (安全超文本传输协议): 默认端口 443&#xff0c;提供了HTTP协议基础上的数据加密和服务器身份验证功能。 •FTP (文件传输协议): 控制通道端口 21&#xf…

oracle设置主键自增步骤

设置主键自增步骤&#xff1a; 每一张表都要设置序列&#xff0c;然后设置触发器。比mysql繁琐。 一、设置序列 选中表后&#xff0c;—》 文件—》新建—》其他—》序列. 设置如下四个值即可。 crtls保存。 给序列起个名字&#xff0c;一定要全大写字母。 二、设置触发器…

移相全桥DC-DC变换器

本篇将基于PPEC-86CA3A移相全桥数字电源控制芯片以及PPEC Workbench开发软件带领大家进行实际移相全桥DC-DC变换器的设计与开发 。 一、移相全桥变换器设计与开发 1、外围电路设计与硬件平台搭建 1&#xff09;外围电路设计 这里给出了PPEC-86CA3A移相全桥数字电源控制芯片的…

字节跳动春招必看:2024最全Spring Controller面试题解析,每位候选人的收藏宝典!

随着Spring框架在企业级应用开发中的普及&#xff0c;对于掌握其核心组件如Spring MVC控制器的需求也随之增长。特别是在面向2024年字节跳动春季招聘时&#xff0c;对于求职者来说&#xff0c;深入理解Spring MVC控制器的运作机制、高级功能及最佳实践变得尤为关键。本篇文章旨…

校招C++大概学习到什么程度?

游戏引擎、图形学的主要开发语言就是C&#xff0c;所以在面试中回答了了几个C问题。我在面试之前完全没有看过任何面试经验&#xff0c;也没有做过类似的题目。可能是因为招实习生&#xff0c;也可能是因为不是C开发&#xff0c;所以问题我觉得都比较简单。在开始前我有一些资料…

QT:三大特性

QT的三大特性&#xff1a; 1、信号与槽 2、内存管理 3、事件处理 1、信号与槽 当信号产生时&#xff0c;就会自动调用绑定的槽函数。 自定义信号: 类中需要添加O_OBJECT宏 声明: signals标签之下进行声明 定义&#xff1a; 信号不需要定义 …

【MySql】1.mysql数据库

一、数据库的基本概念 1.数据 记录事物的信息&#xff1b;按统一的格式进行存储 2.表 数据的集合&#xff0c;行和列的组合&#xff1b;将多条数据组织在一起 3.数据库 表的集合&#xff0c;是存储 相互有关 数据的仓库 二、数据库管理系统 DBMS的主要功能&#xff1a; …

每周一算法:迭代加深A*

题目链接 AcWing 180. 排书 题目描述 给定 n n n 本书&#xff0c;编号为 1 ∼ n 1\sim n 1∼n。 在初始状态下&#xff0c;书是任意排列的。 在每一次操作中&#xff0c;可以抽取其中连续的一段&#xff0c;再把这段插入到其他某个位置。 我们的目标状态是把书按照 1 ∼…

智能风扇的新篇章:唯创知音WTK6900G语音识别芯片引领行业革新

随着科技浪潮的推进&#xff0c;智能化技术逐渐渗透到生活的每一个角落&#xff0c;家电领域尤为明显。风扇&#xff0c;这一夏日清凉神器&#xff0c;也通过智能化改造&#xff0c;焕发出前所未有的光彩。其中&#xff0c;智能语音控制功能的加入&#xff0c;为风扇的使用带来…

Linux基础语法学习外加练习题,训练一、创建文件相关练习题二、文件管理相关练习题三、vim编辑器的练习四、用户管理相关操作

练习题答案请点击链接查看&#xff1a;​​​​​​​Linux基础语法练习题&#xff0c;配有答案&#xff0c;题目内容如下&#xff1a;一、创建文件相关练习题二、文件管理相关练习题三、vim编辑器的练习四、用户管理相关操作-CSDN博客 一、常用命令 1 、 linux 命令特点 1. …

服务器软件express搭建web服务器

文章目录 1.express 是什么2.路由2.1&#xff08;参数一&#xff09;读取用户的请求&#xff08;request&#xff09;2.2&#xff08;参数二&#xff09;给用户响应&#xff08;response&#xff09;2.3&#xff08;参数三&#xff09;next()函数&#xff08;传递请求到下一个处…

科研学习|论文解读——真实与综合:研究设置和任务配置对搜索行为的影响(JASIST,2021)

原文题目 Authentic versus synthetic: An investigation of the influences of study settings and task configurations on search behaviors 摘要 在信息检索和检索研究中,研究者经常收集用户行为数据来预测任务特征,为用户提供个性化信息提供参考。数据采集方法可能会直接…

[AIGC] 主流工作流引擎对比与适用场景介绍

主流工作流引擎对比与适用场景介绍 工作流引擎在业务流程管理中扮演着重要的角色&#xff0c;它可以帮助组织将复杂的工作流程自动化&#xff0c;降低错误率&#xff0c;提高工作效率。目前市面上有许多优秀的工作流引擎&#xff0c;各自都有着独特的优点和适用的场景。本文将介…

动态规划15 | ● 392.判断子序列 ● *115.不同的子序列

392.判断子序列 https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html 考点 子序列问题 我的思路 dp[i][j]的含义是&#xff0c;两个序列分别取到下标为i和j的时候&#xff0c;他们是否满足前者是后者的子序列&#xff0c;满足为True&#x…

涨知识啦!如何使用3dMax和Vray渲染三维室内平面图效果图?

使用3dMax渲染三维室内平面图教程 在建筑和室内设计领域,3D平面效果图在建筑师或设计师与其客户之间更好地沟通方面发挥着重要作用。并不是每个人都能“阅读”建筑二维平面图及其所有技术元素,因此将该平面图转换为更易于理解的布局是很重要的。一个简单的方法是只使用2D图形…

第二十二章 TypeScript weakMap,weakSet,set,map

在es5的时候常用的Array object &#xff0c;在es6又新增了两个类型&#xff0c;Set和Map&#xff0c;类似于数组和对象。 1.set 集合是由一组无序且唯一(即不能重复)的项组成的&#xff0c;可以想象成集合是一个既没有重复元素&#xff0c;也没有顺序概念的数组 属性 size&…

flutter-elinux的基本介绍及安装调试

搜集到两个很有用的网站&#xff1a; 1、flutter-elinux的基本介绍&#xff1a;https://juejin.cn/post/7257285697383612453 2、flutter-elinux的安装调试等&#xff1a;https://github.com/sony/flutter-elinux/wiki 其中&#xff0c;在flutter-elinux设置环境变量时&#…

SSL加密:保护数据传输的安全盾牌

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

AcWing 1250. 格子游戏 (并查集,坐标变换)

记录此题的目的&#xff1a; 明确二维的坐标可以映射到一维&#xff1a;在x和y都是从0开始的前提下&#xff0c;假如图形列数为n&#xff0c;(x,y)映射到一维可以写成x * n y。并查集并不好存储二维数据&#xff0c;如果遇到二维数据可以将其映射到一维。 Alice和Bob玩了一个…

Rust 的 PhantomData

在 Rust 中&#xff0c;PhantomData 是一个零大小的标记类型&#xff0c;用于表示泛型参数的某种“幽灵”所有权或依赖性&#xff0c;而不实际持有该类型的数据。它在标准库中的 std::marker 模块下提供。 使用 PhantomData 的主要场景有&#xff1a; 占位以满足泛型约束&…