Linux C 程序 【04】线程分离

news2024/11/13 22:40:33

1.开发背景

        Linux 线程区分于FreeRTOS,线程的属性形态有2中,在 pthread.h 中有注解,如下。

/* Detach state.  */
enum
{
  PTHREAD_CREATE_JOINABLE,
#define PTHREAD_CREATE_JOINABLE	PTHREAD_CREATE_JOINABLE
  PTHREAD_CREATE_DETACHED
#define PTHREAD_CREATE_DETACHED	PTHREAD_CREATE_DETACHED
};

        线程的的创建可以分为 joinable 和 detached 共 2 种状态,其中 detached 属于分离状态,线程的创建模式是可结合状态,即 joinable,这种情况下线程结束后需要调用 pthread_join 回收资源,否则有出现内存溢出,同时 pthread_join 也起到了等待线程执行完成的功能。

        至于 detached 状态指的是线程分离,即不需要特意调用线程回收功能,线程结束后自动回收。

2.开发需求

设计实验:

        1)循环创建线程为可结合状态,不调用 pthread_join,观察内存的变化;

3.开发环境

        ubuntu20.04 + RK3568 + Linux4.19.232

4.实现步骤

4.1 实现代码

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

#include <pthread.h>

#include "com_save.h"
#include "app_log.h"

#define FILE_PATH_TEST   ("/home/reetoo/log/test")

typedef struct 
{
    /* 线程 */
    pthread_t thread_join;
    pthread_t thread_detach;

}ctrl_t;

static ctrl_t s_ctrl = {0};
static ctrl_t *p = &s_ctrl;

/* 线程函数 */
void* pthread_process(void* arg)
{
    for (int i = 0; i < 1000 * 10000; i++);
    alog_info("%s thread, pid: %d, pthread_self: %ld\r\n", __func__, getpid(), pthread_self());

    return NULL;
}

/* 主函数 */
int main(int argc, char* argv[])
{
    /* 文件保存初始化 */
    csave_init(FILE_PATH_TEST);

    /* 日志模块初始化 */
    alog_init();

    /* 打印日志 */
    alog_info("i am main, pid: %d, pthread_self: %ld\r\n", getpid(), pthread_self());

    /* 设置线程属性 */
    pthread_attr_t attr;
    pthread_attr_init(&attr);

    /* 创建可join线程 */
    static char join_arg[] = "join";
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);    // 设置分离属性
    pthread_attr_setstacksize(&attr, 1024 * 1024);                  // 设置栈大小

    for (int i = 0; i < 100; i++)
    {
        alog_info("create new thread, i: %d\r\n", i);
        pthread_create(&p->thread_join, &attr, (void*)pthread_process, join_arg);
        // pthread_join(p->thread_join, NULL);
        sleep(1);
    }

    /* 销毁线程属性 */
    pthread_attr_destroy(&attr);

    return 0;
}


4.2 测试结果

        使用 top 查看内存变化如下,一直递增,由于 top 并非事实刷新,只能看到内存的变化趋势。因此如果不需要同步操作,可以直接设置线程为分离模式,防止内存溢出。

        

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

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

相关文章

72v-85v输出12v/13.5v电流6A用在电自上AH1009

135-3806-7573.在探讨“72V-85V输出12V/13.5V电流6A用在电动自行车&#xff08;电自上&#xff09;AH1009”这一主题时&#xff0c;我们深入到一个结合了电力电子技术、电池管理系统以及电动自行车性能优化的专业领域。。 *****芯片概述&#xff1a; AH1009是一款宽电压范围、…

数据中心服务器监控系统搭建方案

数据中心监控系统搭建方案 1、背景2、环境3、部署3.1、终端部署3.1.1、服务器配置3.1.1.1、浪潮服务器3.1.1.2、曙光服务器 3.2、服务端部署3.2.1、在线环境下载3.2.2、离线环境安装3.2.3、系统配置 1、背景 服务部署与三个网络环境中&#xff0c;其中某个网位于线下机房&…

Leetcode面试经典150题-2.两数相加

2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数都不…

重塑视觉界限:探索InstantID,超越ReActor的下一代换脸技术!

马斯克与郭德纲&#xff0c;一位是相声界的顶流&#xff0c;一位是科技界的大咖。 想象一下&#xff0c;他们的形象融合&#xff0c;会是什么样&#xff1f; 最新推出的开源项目 —— InstantID 让这种“跨界融合”成为可能。 来瞧瞧&#xff0c;“马德纲”有惊艳到你吗&…

回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN

回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN 文章目录 前言回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN 一、SSA-DNN模型1. 麻雀优化算法&…

想发SCI,先写论文还是先选刊?手把手带你分析如何提高发表成功率!

点击关注&#xff1a;关注GZH【欧亚科睿学术】&#xff0c;GET完整版2023JCR分区列表&#xff01; 发SCI是先写论文还是先选刊 发SCI论文时&#xff0c;通常建议先选择合适的期刊再开始写论文。 先选刊的策略意味着你在撰写论文之前&#xff0c;先确定一个或多个可能投稿的期…

2021-11-08 51单片机2位秒表启动清零

缘由c51单片机&#xff0c;程序&#xff0c;仿真图&#xff0c;求帮助-编程语言-CSDN问答 #include "REG52.h"sbit K1 P1^0; sbit K2 P1^1; sbit K3 P1^2; sbit K4 P1^3; sbit P1_0P2^0; sbit P1_1P2^1; sbit P1_2P2^2; sbit P1_3P2^3; sbit P1_4P2^4; sbit P1_…

C++八股文(一)

&#x1f3f3;‍&#x1f308;C基础 &#x1f331;1.C特点 1. C 在 C 语言基础上引入了 面对对象 的机制&#xff0c;同时也 兼容 C 语言 。 2. C 有三大特性 &#xff08; 1 &#xff09;封装。&#xff08; 2 &#xff09;继承。&#xff08; 3 &#xff09;多态&#xff…

网站模板建站和定制网站哪个更适合中小企业?

通俗来说&#xff0c;网站建设有模板建设、定制建站两个门类。在聊聊网站建设多少钱之前&#xff0c;我们可以先来简单分析一下模板建站和定制建站的优缺点在哪。 一、模板建站 优势&#xff1a;1.极大看重性价比&#xff0c;价格优势会较高。 劣势&#xff1a;1.因是在已有的模…

Datawhale AI夏令营--从零入门多模态大模型数据合成Task1

从零入门多模态大模型数据合成 报名赛事注意事项 创建实例跑baseline(预计时间300分钟)改用无卡模式开机创建非指定镜像 下载赛事所需文件包下载模型,数据集以及依赖软件下载模型和相关数据集下载BLIP图片描述模型 数据处理与合成推理和评测打包输出运行结果提交结果 报名赛事 …

Open3D 计算点云的协方差矩阵(原理详细版)

目录 一、概述 1.1协方差矩阵的定义 1.2实现步骤 1.3应用 二、代码实现 1.1实现代码 2.2协方差应用案例 2.2.1主成分分析法的应用 2.2.2平面拟合 三、疑问解答 3.1为什么计算协方差矩阵要去质心&#xff1f; 3.1.1原因 3.1.2区别 Open3D点云算法汇总及实战案例汇总…

WordPress建站之头像及字体错误修正

目录 一、谷歌字体 二、头像网址 三、后续使用中的“坑” 网站建设好以后&#xff0c;会发现有些卡顿&#xff0c;网速好的环境感觉不明写&#xff0c;但是差的环境就难以忍受了。这是打开网页的控制台&#xff08;Console&#xff09;会发现有报错信息&#xff1a; 这些报错…

数组---怎么样定义和引用数组

一怎么定义数组 例 int a[10]; //定义了一个一维数组&#xff0c;数组名为a&#xff0c;此数组包含10个整型元素 所以我们了解到数组的基本定义为 类型符 数组名 [常量表达式] 定义数组可以包括常量和符号常量如 int [ 35 ];但是不能利用变量定义如 int n&#xff1b; …

数据结构(6_1_1)——图的基本概念

图的定义 图G由顶点集V和边集E组成&#xff0c;记为G(V,E),其中V(G)表示图G中顶点的有限非空集&#xff1b;E(G)表示图G中顶点之间的关系(边)集合。若V{v1,v2,.....,vn},则用|V|表示图G中顶点的个数&#xff0c;也称图G的阶&#xff0c; ,用|E|表示图G中的边的条数 注意&…

【产品那些事】The OX Active ASPM Platform

文章目录 前言关于OX Security产品理念 流程体验Complete Visibility&#xff1a;将安全无缝嵌入到SDLC中PBOMOSC&R coverageContextualized Prioritization&#xff1a;快速解决最关键的风险Accelerated Response&#xff1a;简化安全流程See Beyond the Code&#xff1a;…

idea vue项目删除node_modules时报文件损坏且无法读取,导致删除失败

解决办法&#xff0c;查看node_modules所在盘&#xff0c;右击点击属性-工具&#xff0c;点击检查驱动&#xff0c;查完后修复即可&#xff0c; 就能够成功删除损坏的文件了

实时降水、降雨量接口对接,预报未来2小时有没有下雨

可实现的效果图 接口请求地址&#xff1a; http://ykyrain.tianqiapi.com 请求示例&#xff1a; http://ykyrain.tianqiapi.com/?versionrain&appid17256853&appsecretYtFbK6VP&lng114.302953&lat30.585411 请求参数 参数名必选类型说明备注&#xff08;示…

[ 烧录教程 ]Phy6212-ST17H66快捷烧录调试-体验蓝牙烧写调试助手

目录 一、前言 二、任务要求 三、实现步骤 3.1 打开基本任务例程 3.2 编辑任务代码 3.3 通过蓝牙烧写调试助手查看效果 3.4 修改完善代码 3.5 继续烧写调试 四、总结 一、前言 基于Phy6212或ST17H66芯片的烧写的繁琐性&#xff0c;因此我将使用蓝牙调试助手完成本文中…

CentOS部署Oracle19c(rpm方式)

软件包下载地址 一共需要两个软件包 # oracle数据库企业版 oracle-database-ee-19c-1.0-1.x86_64.rpm# Oracle Database 19c的预安装RPM包&#xff0c;它主要用于在正式安装Oracle数据库之前准备系统环境 oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpmhttps://yum.or…

图像复原算法

7.1 逆滤波 (Inverse Filtering) 介绍 逆滤波是一种基本的图像复原方法&#xff0c;用于从退化图像中恢复原始图像。它通过逆向应用退化过程中的滤波器来恢复图像。 原理 逆滤波假设图像在退化过程中受到线性且时不变的滤波器影响&#xff0c;并尝试通过逆向应用该滤波器来…