Linux C 程序 【03】线程栈空间

1.开发背景

        上一个篇章创建了线程,参考 FreeRTOS,每个线程都是有自己的内存空间,Linux上面也是一样的,这个篇章主要描述线程栈空间的设置。

2.开发需求

设计实验:

        1)创建线程,并配置线程内存大小

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;}ctrl_t;static ctrl_t s_ctrl = {0};
static ctrl_t *p = &s_ctrl;/* 递归函数 */
void recursive_function(int depth) 
{char buffer[1024 * 1024]; // 使用一个较大的局部变量来加速栈的消耗(void)buffer;alog_info("%s Depth: %d\n", __func__, depth);recursive_function(depth + 1);
}/* 线程函数 */
void* pthread_process(void* arg)
{/* 打印日志 */alog_info("i am pthread_process, pid: %d, pthread_self: %ld\r\n", getpid(), pthread_self());/* 递归函数调用 */recursive_function(0);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;/* 设置线程属性 */size_t stacksize;pthread_attr_init(&attr);pthread_attr_setstacksize(&attr, 1024 * 128); // 设置线程栈大小pthread_attr_getstacksize(&attr, &stacksize); // 获取线程栈大小alog_info("128K stacksize: %ldBytes, %ldKBytes\n", stacksize, stacksize / 1024);pthread_attr_init(&attr);pthread_attr_setstacksize(&attr, 1024 * 127); // 设置线程栈大小pthread_attr_getstacksize(&attr, &stacksize); // 获取线程栈大小alog_info("127K stacksize: %ldBytes, %ldKBytes\n", stacksize, stacksize / 1024);pthread_create(&p->thread, &attr, (void*)pthread_process, NULL);pthread_attr_destroy(&attr);/* 等待线程结束 */pthread_join(p->thread, NULL);return 0;
}

4.2 测试结果

        由测试结果可知,线程的内存堆栈是可以设置的,而且有最小值,这里的最小内存是 128KB,小于128KB的按照默认大小 8192KB 配置。

        代码里递归函数 recursive_function 每递归一次消耗 1024KB 内存,完成了 0 - 6 共 7 次递归,第 8 次递归直接越界,产生段错误,内存溢出。

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

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

相关文章

培训第二十二天(mysql数据库主从搭建)

上午 1、为mysql添加开机启动chkconfig [rootmysql1 ~]# chkconfig --list //列出系统服务在不同运行级别下的启动状态注&#xff1a;该输出结果只显示 SysV 服务&#xff0c;并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 要列出 systemd 服务…

IEEE报告解读:存储技术发展趋势分析

1.引言 随着数据科学、物联网&#xff08;IoT&#xff09;和永久存储需求的快速增长&#xff0c;对大规模数据存储的需求正在迅速增加。存储技术的发展趋势直接关系到数据的可靠性和经济性。本文将根据IEEE最新发布的《2023年国际器件与系统路线图》&#xff0c;深入探讨各种存…

AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling

发表时间&#xff1a;arXiv 2024年2月26日 论文链接&#xff1a;https://arxiv.org/pdf/2402.12226 作者单位&#xff1a; Fudan University Motivation&#xff1a; LLM 在理解和生成人类语言方面表现出非凡的能力。但是&#xff0c;LLM 的能力仅限于针对文本的处理。而现…

详解Xilinx FPGA高速串行收发器GTX/GTP(2)--什么是GTX?

文章总目录点这里:《FPGA接口与协议》专栏的说明与导航 GTX本质上是基于SerDes技术的高速串行收发器,它是FPGA内部的底层电路,也叫做Gigabit Transceiver(吉比特收发器,简称为GT)。其中A7系列使用的GT叫GTP,K7系列使用的GT叫GTX,V7系列使用的GT叫GTH和GTZ,它们…

循环神经网络和自然语言处理一

目录 一.分词 1.分词工具 2.分词的方法 3.N-gram表示方法 二.向量化 1.one-hot编码 2.word embedding 3.word embedding API 4.数据形状改变 既然是自然语言&#xff0c;那么就有字&#xff0c;词&#xff0c;句了 一.分词 1.分词工具 tokenization&#xff0c;jie…

【数据结构】二叉搜索树(Java + 链表实现)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

【DOCKER】显示带UI的软件

1. Linux 1.1 宿主机开放X server权限 xhost 1.2 启动容器 docker run -it --rm --privilegedtrue --useru20 --workdir/home/u20 \ -e DISPLAYhost.docker.internal:0 u20:dev1.3 测试 # 安装测试软件 sudo apt-get -y install x11-apps# 显示测试程序 xclock2. Windows …

LearnOpenGL-光照章节学习笔记

LearnOpenGL-光照章节学习笔记 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 投光物一、平行光二、点光源衰减实现 三、聚光灯平滑边缘 多光源一、平行光&#xff08;定向光&#xff09;二、…

免费代理池是什么,如何使用代理IP进行网络爬虫?

互联网是一个庞大的数据集合体&#xff0c;网络信息资源丰富且繁杂&#xff0c;想要从中找到自己需要的信息要花费较多的时间。为了解决这个问题&#xff0c;网络爬虫技术应运而生&#xff0c;它的主要作用就是在海量的互联网信息中进行爬取&#xff0c;抓取有效信息并存储。然…

广州城市信息模型(CIM)白皮书学习

CIM平台定义 以建筑信息模型(BIM)、地理信息系统(GIS)、物联网(IoT)等技术为基础&#xff0c;整合城市地上地下、室内室外、历史现状未来多维多尺度信息模型数据和城市感知数据&#xff0c;构建起三维数字空间的城市信息有机综合体。 广州CIM平台建设历程 2019 年 6 月住房和…

动手学深度学习V2每日笔记(深度卷积神经网络AlexNet)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1h54y1L7oe/spm_id_from333.788.recommend_more_video.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&…

13021.Nvidia AGX orin 平台学习记录

文章目录 1 Jetson AGX 开发板编译环境搭建1.1 官方资料包下载1.2 开发者手册1.2.1 安装jetpack 2 更新Image文件2.1 自编译的Image内核文件更新到系统 3 编译文档3.1 编译内核步骤3.1.1 下载kernel_src 源码包3.1.2 编译内核 3.2 编译内核工具链下载3.2 orin 介绍 4 csi_trace…

Shell定时上传日志到HDFS

Shell定时上传日志到HDFS 一、任务需求二、实现思路三、具体实现流程3.1 规划文件上传目录3.2 开发 shell 脚本3.3 授予 shell 可执行权限3.4 手动执行查看3.4 定时执行 shell 脚本 一、任务需求 公司在线服务器每天都会产生网站运行日志&#xff0c;为了避免志文件过大&#…

QT Word文档控件QAxWidget C++退出

我们知道每次加载word控件&#xff0c;都会导致后台启动一个WINWORD.EXE 如何安全退出呢 1、一个最简单的例子 QT core gui axcontainer MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QAxWidget> #include…

【强化学习的数学原理】课程笔记--6(Actor-Critic方法)

目录 Actor-Critic 方法QAC 算法Advantage Actor-Critic 算法Baseline invariance Off-policy Actor-Critic重要性采样 Deterministic Policy Gradient (DPG) 系列笔记&#xff1a; 【强化学习的数学原理】课程笔记–1&#xff08;基本概念&#xff0c;贝尔曼公式&#xff09; …

Java哈希算法

哈希算法 哈希算法1.概述2.哈希碰撞3.常用的哈希算法4.哈希算法的用途4.1校验下载文件4.2存储用户密码MD5加密5.SHA-1加密小结&#xff1a; 哈希算法 1.概述 哈希算法&#xff08;Hash&#xff09;又称摘要算法&#xff08;Digest&#xff09;&#xff0c;它的作用是&#xf…

[软件测试·研究向] MuJava 工具遇到的问题汇总和体会

MuJava 是初学者&#xff08;研究向&#xff09;常常会去使用的一个工具&#xff0c;也是 Java 软件测试的一个老牌工具。用于为 Java 代码生成变异体和运行单元测试。但是此工具已经有十年没有更新了&#xff0c;这款软件可以说现在已经不能够支持对主流软件框架运行测试。但是…

软考-软件设计师 (计算机组成和体系结构习题)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

优秀的行为验证码的应用场景与行业案例

应用场景 登录注册 &#xff1a; 验证码适用于App、Web及小程序等用户注册场景&#xff0c;可以抵御自动机恶意注册&#xff0c;垃圾注册、抵御撞库登录、暴力破解、验证账号敏感信息的修改&#xff0c;同时可以有效阻止撞库攻击&#xff0c;从源头进行防护&#xff0c;保障正…

ip地址冲突会影响整个网络吗

在数字化时代&#xff0c;网络已成为连接世界的桥梁&#xff0c;而IP地址则是这座桥梁上不可或缺的“门牌号”。然而&#xff0c;当这个独特的身份标识出现冲突时&#xff0c;整个网络的稳定运行将面临严峻挑战。IP地址冲突&#xff0c;这一看似微小的技术问题&#xff0c;实则…