当前位置: 首页 > news >正文

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

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

相关文章:

linux下线程分离属性

linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性&#xff1f; 首先分离属性是线程的一个属性&#xff0c;有了分离属性的线程&#xff0c;不需要别的线程去接合…...

Leetcode 208. 实现 Trie (前缀树)

心路历程&#xff1a; 一道题干进去了一个下午&#xff0c;单纯从解题角度可以直接用python的集合就很简单地解决&#xff08;不知道是不是因为python底层的set()类&#xff09;。后来从网上看到这道题应该从前缀树的角度去做&#xff0c;于是花了半个多小时基于字典做了前缀树…...

蓝桥杯练习题——健身大调查

在浏览器中预览 index.html 页面效果如下&#xff1a; 目标 完成 js/index.js 中的 formSubmit 函数&#xff0c;用户填写表单信息后&#xff0c;点击蓝色提交按钮&#xff0c;表单项隐藏&#xff0c;页面显示用户提交的表单信息&#xff08;在 id 为 result 的元素显示&#…...

React——组件通讯

组件通讯介绍 组件中的状态是私有的&#xff0c;组件的状态只能在组件内部使用&#xff0c;无法直接在组件外使用&#xff0c;但是我们在日常开发中&#xff0c;通常会把相似、功能完整的应用才分成组件&#xff08;工厂模式&#xff09;利于我们的开发&#xff0c;而不同组件直…...

php闭包应用

laravel 路由 bingTo 把路由URL映射到匿名回调函数上&#xff0c;框架会把匿名回调函数绑定到应用对象上&#xff0c;这样在匿名函数中就可以使用$this关键字引用重要的应用对象。Illuminate\Support\Traits\Macroable的__call方法。 自己写一个简单的demo: <?php <?…...

基于python+vue的OA公文发文管理系统flask-django-php-nodejs

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对OA公文发文管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…...

脉冲变压器电感的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,铁心结构3.2,铁心材料3.3,绕组4,工艺流程4.1,准备铁芯4.2,绕制线圈4.3,安装线圈4.4,固定线圈4.5,绝缘处理4.6,高压脉冲引出...

java中Arrays介绍及常用方法

在Java中&#xff0c;java.util.Arrays类是一个提供了各种操作数组的工具类。该类提供了一系列静态方法来对数组进行排序、搜索、填充、复制等操作。下面是对Arrays类的介绍以及常用方法的说明: toString()方法&#xff1a;将数组转换为字符串形式并返回&#xff0c;方便输出数…...

CTF题型 Http请求走私总结Burp靶场例题

CTF题型 Http请求走私总结&靶场例题 文章目录 CTF题型 Http请求走私总结&靶场例题HTTP请求走私HTTP请求走私漏洞原理分析为什么用前端服务器漏洞原理界定标准界定长度 重要!!!实验环境前提POST数据包结构必要结构快速判断Http请求走私类型时间延迟CL-TETE-CL 练习例题C…...

Nginx 的安装、启动和关闭

文章目录 一、背景说明二、Nginx 的安装2.1、依赖的安装2.2、Nginx 安装2.3、验证安装 三、启动 Nginx3.1、普通启动3.2、如何判断nginx已启动3.3、通过配置启动3.4、设置开机启动 四、关闭 Nginx4.1、优雅地关闭4.2、快速关闭4.3、只关闭主进程4.4、使用nginx关闭服务 五、重启…...

python 操作excel(openpyxl.load_workbook)、excel操作封装

操作excel 其他的库&#xff1a; xlrd xlwt &#xff1a; 过时了&#xff0c;只能操作xls后缀的文件。pandas&#xff1a;大数据测试 数据分析项目会用。 openpyxl&#xff1a;第三方库 支持的格式有&#xff1a;.xlsx、.xlsm、.xltx、.xltm&#xff0c;l不支持.xls文件格式…...

MySQL系统参数配置实战:生产环境优化

引言&#xff1a; MySQL作为广泛应用的关系型数据库&#xff0c;其系统参数配置直接影响着数据库的性能、稳定性以及资源利用率。本文旨在深入探讨MySQL的核心系统参数&#xff0c;并提供一份面向生产环境的配置建议&#xff0c;以帮助运维人员更好地优化数据库性能&#xff0…...

判断列表中每一个元素的个数

1.使用循环 nums [1, 1, 1, 2, 2, 3]# 构建一个空字典来存储元素和它们出现的次数 count_dict {}# 遍历列表&#xff0c;更新字典中每个元素出现的次数 for num in nums:if num in count_dict:count_dict[num] 1else:count_dict[num] 1# 输出统计结果 for num, count in c…...

目标检测——PP-YOLOE算法解读

PP-YOLO系列&#xff0c;均是基于百度自研PaddlePaddle深度学习框架发布的算法&#xff0c;2020年基于YOLOv3改进发布PP-YOLO&#xff0c;2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet&#xff0c;2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列&#xff0c;所以放一起解…...

每日一题 --- 螺旋矩阵 II[力扣][Go]

螺旋矩阵 II 题目&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出…...

C语言自定义类型结构体

variable adj.易变的&#xff0c;多变的&#xff1b;时好时坏的&#xff1b;可变的&#xff0c;可调节的&#xff1b; &#xff08;数&#xff09;&#xff08;数字&#xff09;变量的&#xff1b;&#xff08;植&#xff0c;动&#xff09;变异的&#xff0c;变型的&#xff1…...

【SpringBoot框架篇】37.使用gRPC实现远程服务调用

文章目录 RPC简介gPRC简介protobuf1.文件编写规范2.字段类型3.定义服务(Services) 在Spring Boot中使用grpc1.父工程pom配置2.grpc-api模块2.1.pom配置2.2.proto文件编写2.3.把proto文件编译成class文件 3.grpc-server模块3.1.pom文件和application.yaml3.2.实现grpc-api模块的…...

投资的三个匹配

许多人亏钱都是犯了同样错误&#xff0c;要么对投资的预期过高&#xff0c;要么是投资期限不匹配&#xff0c;要么是波动承受能力不匹配。投资想要赚钱&#xff0c;先解决匹配问题。 1.预期收益率要匹配 就是明确自己做投资&#xff0c;每年想赚多少钱。凡事都要有个目标&…...

[Netty实践] 请求响应同步实现

目录 一、介绍 二、依赖引入 三、公共部分实现 四、server端实现 五、client端实现 六、测试 一、介绍 本片文章将实现请求响应同步&#xff0c;什么是请求响应同步呢&#xff1f;就是当我们发起一个请求时&#xff0c;希望能够在一定时间内同步&#xff08;线程阻塞&am…...

Java进阶—哈希冲突的解决

1. 什么是哈希冲突 哈希函数&#xff1a;哈希函数是一种将输入数据(键)映射到固定大小范围的输出值(哈希值)的函数。哈希函数通常用于存储 数据存储和检索领域&#xff0c;例如哈希表中。 哈希表&#xff1a;哈希表(Hash Table)&#xff0c;也成为哈希映射(Hash Map)或字典&…...

一个简单到尴尬却有效的SFT实验

卷友们好&#xff0c;我是rumor。上周Apple有篇论文做了一个简单到有点尴尬的实验&#xff1a;从模型自己采样一批代码答案&#xff0c;不过滤对错&#xff0c;不执行验证&#xff0c;直接拿去SFT。结果Qwen3-30B在LiveCodeBench v6上&#xff0c;pass1从42.4%涨到55.3%&#x…...

3步解决魔兽争霸III现代兼容难题:写给经典RTS玩家的优化指南

3步解决魔兽争霸III现代兼容难题&#xff1a;写给经典RTS玩家的优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽…...

别再手动传文档了!Unity+Coze知识库自动上传与进度监控全攻略

UnityCoze知识库自动化上传与进度监控实战指南 在游戏开发中&#xff0c;剧情文本、设定文档等资源的管理往往需要频繁更新和版本控制。传统的手动上传方式不仅效率低下&#xff0c;还容易出错。本文将带你构建一个完整的自动化解决方案&#xff0c;实现从Unity到Coze知识库的…...

LiuJuan20260223Zimage国风美学生成模型v1.0入门:Node.js环境调用与API开发

LiuJuan国风美学生成模型v1.0入门&#xff1a;Node.js环境调用与API开发 最近在尝试一些AI图像生成项目&#xff0c;发现很多模型对中文场景和东方美学的支持还不够好。直到我遇到了LiuJuan国风美学模型&#xff0c;它专门针对国风、古风、东方元素进行优化&#xff0c;生成的…...

智能售后工单分类:EcomGPT-7B+NLP多标签分类

智能售后工单分类&#xff1a;EcomGPT-7BNLP多标签分类 电商售后每天涌入数千张工单&#xff0c;人工分类处理需要4小时&#xff0c;现在只需30分钟 每天早晨&#xff0c;电商客服团队都要面对堆积如山的售后工单。商品质量问题、物流投诉、退款申请、技术咨询……各种问题混杂…...

Claude Mythos Preview发布文章解读

1. 引入 anthropic于4月7日发布了Mythos Preview模型相关的说明文章&#xff08;参考1&#xff09;&#xff0c;并提出了目前不开放它的政策&#xff0c;还说了它在网安领域的能力很强。 那么&#xff0c;它的这些思路&#xff0c;是出于什么考虑呢&#xff1f; 2. 首次提到的内…...

GPEN图像肖像增强镜像实测:5分钟修复老照片,效果惊艳到哭

GPEN图像肖像增强镜像实测&#xff1a;5分钟修复老照片&#xff0c;效果惊艳到哭 1. 老照片修复的新选择 上周在整理家族相册时&#xff0c;我发现了一叠泛黄的老照片。这些珍贵的记忆因为年代久远&#xff0c;已经变得模糊不清&#xff0c;布满划痕和噪点。传统的修图软件要…...

“你用AI,那我也会用AI,我还要你干什么?”罕

这个代码的核心功能是&#xff1a;基于输入词的长度动态选择反义词示例&#xff0c;并调用大模型生成反义词&#xff0c;体现了 “动态少样本提示&#xff08;Dynamic Few-Shot Prompting&#xff09;” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts impo…...

汽车牌照数据集 YOLO 目标检测 | 可下载

点击下载数据集~ 关于数据集&#xff1a; 数据集&#xff1a;汽车牌照检测 该数据集包含车牌图像及其对应的YOLO格式标注。它旨在用于训练和评估专注于检测图像中车牌的模型。 数据集概览&#xff1a; 图片总数&#xff1a; 433 张车牌图片 图片格式&#xff1a; .png 标…...

深入解析航顺HK32F030C8T6与STM32F030的兼容性差异及实战调优

1. 航顺HK32F030C8T6与STM32F030的硬件差异解析 第一次拿到航顺HK32F030C8T6这颗国产MCU时&#xff0c;我下意识以为它和STM32F030可以完全互换。但实际在智能家居项目中踩坑后才发现&#xff0c;两者的硬件差异远比想象中多。最明显的区别就是主频——STM32F030最高只能跑到48…...