Linux C 程序 【04】线程分离

1.开发背景

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

/* Detach state.  */
enum
{PTHREAD_CREATE_JOINABLE,
#define PTHREAD_CREATE_JOINABLE	PTHREAD_CREATE_JOINABLEPTHREAD_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.rhkb.cn/news/396614.html

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

相关文章

Jenkins保姆笔记(2)——基于Java8的Jenkins插件安装

前面我们介绍过&#xff1a; Jenkins保姆笔记&#xff08;1&#xff09;——基于Java8的Jenkins安装部署 本篇主要介绍下基于Java8的Jenkins插件安装。为什么要单独讲一个插件安装&#xff1f;因为一些原因&#xff0c;Jenkins自带的插件源下载几乎都会失败&#xff0c;如图…

【vulhub靶场之thinkphp】——(5-rce)

第一步&#xff1a;打开靶场 输入开启命令 cd vulhub/thinkphp/5-rce docker-compose up -d docker-compose ps//查看开启的端口 第二步&#xff1a; 访问网址 第三步&#xff1a;漏洞利用 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&am…

24/8/6算法笔记 支持向量机

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习算法&#xff0c;主要用于分类和回归任务。它基于统计学习理论中的结构风险最小化原理&#xff0c;通过找到数据点之间的最优边界来实现模型的泛化能力。 import numpy as np import matplotlib.…

Android 下载安装配置

文章目录 Android Studio 下载安装配置1. 下载JDK2. JDK环境配置&#xff1a;3. 测试JDK是否安装成功&#xff1a;4. 下载Android Studio:5. 配置Android Studio:6. android studio提速方法1&#xff08;不行&#xff09;方法2&#xff1a;(很行&#xff09; Android Studio 下…

STL容器之vector

1.vector的介绍及使用 1.1vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可…

快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 分布式链路追踪篇(ClickHouse 官方博客)...

引言 在 ClickHouse&#xff0c;我们认为可观测性仅仅是另一个实时分析问题。作为一款高性能的实时分析数据库&#xff0c;ClickHouse 被用于多种场景&#xff0c;包括时间序列数据的实时分析。其应用场景的多样性推动了大量分析函数的发展&#xff0c;这些函数有助于查询大多数…

【Python】PyWebIO 初体验:用 Python 写网页

目录 前言1 使用方法1.1 安装 Pywebio1.2 输出内容1.3 输入内容 2 示例程序2.1 BMI 计算器2.2 Markdown 编辑器2.3 聊天室2.4 五子棋 前言 前两天正在逛 Github&#xff0c;偶然看到一个很有意思的项目&#xff1a;PyWebIo。 这是一个 Python 第三方库&#xff0c;可以只用 P…

Atcoder Beginner Contest 366

传送门 A - Election 2 时间限制&#xff1a;2秒 内存限制&#xff1a;1024MB 分数&#xff1a;100分 问题描述 在 AtCoder 市举行市长选举。候选人是 Takahashi 和 Aoki。 目前有 N 张有效选票投给了这两个候选人&#xff0c;并且计票正在进行中。这里&#xff0…

配置Cuttlefish 虚拟 Android 设备

google 参考资料&#xff1a; https://source.android.com/docs/setup/start?hlzh-cn https://source.android.com/docs/devices/cuttlefish/get-started?hlzh-cn Cuttlefish 开始 验证 KVM 可用性 Cuttlefish 是一种虚拟设备&#xff0c;依赖于宿主机上可用的虚拟化。 …

Laravel 使用Excel导出的文件中,指定列数据格式为日期,方便后期的数据筛选操作

背景 最近&#xff0c;后台运营人员要求导出的 Excel 文件&#xff0c; 要求能够满足对于 [下单日期] 的筛选操作&#xff0c;即满足在年份、月份上的选择 通过了解&#xff0c;发现&#xff1a; 先前导出的文件&#xff0c;默认列数据都是字符串&#xff08;文本&#xff09;格…

bia文件中码偏差对实时PPP解算分析

1. 码偏差对定位影响 码偏差对未知收敛时间有影响&#xff0c;对最终精度影响不大&#xff08;权比1000:1&#xff09;

前端工程化14-git merge 以及 git rebase。

rebase会把当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像从公共分支又重新拉出来这个分支一样。 举例&#xff1a; 如果从 master 拉个feature分支出来,然后提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的…

【Hot100】LeetCode—295. 数据流的中位数

目录 1- 思路① 添加元素实现② 计算实现 2- 实现⭐295. 数据流的中位数——题解思路 原题链接&#xff1a;295. 数据流的中位数 1- 思路 利用优先级队列实现一个大顶堆和一个小顶堆大顶堆用来存放较小的元素&#xff0c;小顶堆用来存放较大的元素 ① 添加元素实现 如果当前…

JVM知识总结(双亲委派机制)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 双亲委派机制 双亲委派类加载过程 当App尝试加载一个类时&#x…

haproxy基础

HAProxy (High Availability Proxy) 是一款强大的开源负载均衡器和代理服务器。它主要用于提高 Web 应用程序和服务的可用性和性能。HAProxy 可以在 TCP 和 HTTP 层面上工作&#xff0c;并且支持多种负载均衡算法&#xff0c;广泛应用于高流量网站和大型分布式系统中。 社区版…

【数学建模】简单的优化模型-6 血管分支

背景&#xff1a;机体提供能量维持血液在血管中的流动&#xff0c;给血管壁以营养&#xff1b;克服血液流动的阻力&#xff0c;能量消耗与血管的几何形状有关。在长期进化中动物血管的几何形状已经在能量消耗最小原则下达到最优化。 问题&#xff1a;在能量消耗最小原则下&…

现代卷积神经网络

经典的CNN架构 一、早期的CNN架构 LeNet LeNet&#xff0c;&#xff08;也称为LeNet-5&#xff0c;5代表使用了2个卷积层和3个全连接层&#xff09;是一个经典的卷积神经网络架构&#xff0c;最初由Yann LeCun等人开发用于MNIST数据集手写数字&#xff08;灰度图像 输入通道…

nuPlan环境配置和开环及闭环评测

环境配置 下载nuplan mini 数据集 nuPlan Maps nuPlan Mini Split 解压并按照制定目录结构存储 ./nuplan/ |-- maps -- nuplan-v1.1-- splits-- mini为了不修改代码, 需软链目录 ln -s ./nuplan /data/sets/ 下载nuplan镜像 docker pull horizonrobotics/nuplan:cuda11.8.0…

Golang | Leetcode Golang题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; func countRangeSum(nums []int, lower, upper int) int {var mergeCount func([]int) intmergeCount func(arr []int) int {n : len(arr)if n < 1 {return 0}n1 : append([]int(nil), arr[:n/2]...)n2 : append([]int(nil), arr[n/2:]…

Flink 实时数仓(八)【DWS 层搭建(二)流量域、用户域、交易域搭建】

前言 今天的任务是完成流量域最后一个需求、用户域的两个需求以及交易域的部分需求&#xff1b; 1、流量域页面浏览各窗口汇总表 任务&#xff1a;从 Kafka 页面日志主题读取数据&#xff0c;统计当日的首页和商品详情页独立访客数。 注意&#xff1a;一般我们谈到访客&…