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

如何查看SoC线程的栈起始地址及大小

在 Linux 中,每个线程都有自己独立的栈空间,用于存储线程的局部变量、函数调用信息等。我们可以通过 pthread_attr_t 数据结构来获取或设置线程的栈起始地址和栈大小。

要查看线程的栈起始地址和栈大小,使用 pthread_attr_getstack() 函数。它从线程属性对象中获取这两个信息。函数原型如下:

#include <pthread.h>
int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);

参数说明:

  • attr: 指向线程属性对象的指针(pthread_attr_t 类型)。
  • stackaddr: 用于存储线程栈的起始地址,传递一个指向 void * 类型的指针,pthread_attr_getstack() 会将栈的起始地址保存在该指针指向的内存中。
  • stacksize: 用于存储线程栈的大小,传递一个指向 size_t 类型的指针,pthread_attr_getstack() 会将栈的大小保存在该指针指向的内存中。

返回值:

  • 成功返回 0。
  • 失败返回错误码(非 0 值)。

如果要设置线程的栈起始地址和栈大小,使用 pthread_attr_setstack() 函数。其原型如下:

#include <pthread.h>
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);

参数说明:

  • attr: 指向线程属性对象的指针,用于设置线程栈的属性。
  • stackaddr: 指定栈的起始地址。通常由用户分配一块内存作为线程栈,然后传递它的地址。
  • stacksize: 指定栈的大小,必须是系统允许的最小栈大小之上,通常至少为 PTHREAD_STACK_MIN,否则返回错误。

返回值:

  • 成功返回 0。
  • 失败返回错误码(非 0 值)。

以下是获取线程栈起始地址和栈大小的示例代码:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>void *thread_function(void *arg) {printf("Thread running...\n");pthread_exit(NULL);
}int main() {pthread_t thread;pthread_attr_t attr;void *stackaddr;size_t stacksize;// 初始化线程属性对象pthread_attr_init(&attr);// 获取默认的栈起始地址和栈大小pthread_attr_getstack(&attr, &stackaddr, &stacksize);printf("Default stack address: %p\n", stackaddr);printf("Default stack size: %zu bytes\n", stacksize);// 创建线程if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {perror("Failed to create thread");return 1;}// 等待线程结束pthread_join(thread, NULL);// 销毁线程属性对象pthread_attr_destroy(&attr);return 0;
}

输出结果如下:

Default stack address: 0x7fcd49800000
Default stack size: 8388608 bytes

除了获取栈的起始地址和大小外,还可以使用以下函数单独获取或设置栈的大小或起始地址:

  • pthread_attr_setstacksize():设置栈大小。
  • pthread_attr_getstacksize():获取栈大小。
  • pthread_attr_setstackaddr():设置栈起始地址。
  • pthread_attr_getstackaddr():获取栈起始地址。

例如,如果你只想设置栈的大小而不需要改变栈的起始地址,可以使用 pthread_attr_setstacksize()

#include <pthread.h>
#include <stdio.h>int main() {pthread_attr_t attr;size_t stacksize = 16 * 1024 * 1024;  // 设置栈大小为 16 MB// 初始化线程属性pthread_attr_init(&attr);// 设置栈大小pthread_attr_setstacksize(&attr, stacksize);// 获取并打印新的栈大小pthread_attr_getstacksize(&attr, &stacksize);printf("New stack size: %zu bytes\n", stacksize);// 销毁线程属性对象pthread_attr_destroy(&attr);return 0;
}

注意事项:

  1. 栈大小不能小于系统允许的最小栈大小,可以通过 PTHREAD_STACK_MIN 宏获得最小值。
  2. 手动设置栈地址时,需要确保传递的内存块有效且大小合适。

通过 pthread_attr_getstack()pthread_attr_setstack() 函数,可以方便地获取和设置线程的栈起始地址和栈大小。对于需要自定义线程栈的应用程序,合理地管理栈空间可以提高程序的稳定性和性能。在多线程编程中,了解和控制线程的栈使用情况对于高效的内存管理和避免栈溢出至关重要。

http://www.lryc.cn/news/608845.html

相关文章:

  • Mysql的MVCC是什么
  • 主成分分析法 PCA 是什么
  • 2、RabbitMQ的5种模式基本使用(Maven项目)
  • kafka 是一个怎样的系统?是消息队列(MQ)还是一个分布式流处理平台?
  • Linux常用命令分类总结
  • 井盖识别数据集-2,700张图片 道路巡检 智能城市
  • 本地环境vue与springboot联调
  • ThinkPHP 与 Vue.js 结合的全栈开发模式
  • 十八、Javaweb-day18-前端实战-登录
  • 《前端无障碍设计的深层逻辑与实践路径》
  • 【openlayers框架学习】十一:openlayers实战功能介绍与前端设计
  • K8S几种常见CNI深入比较
  • 企业自动化交互体系的技术架构与实现:从智能回复到自动评论—仙盟创梦IDE
  • ThinkPHP8学习篇(一):安装与配置
  • Go语言--语法基础7--函数定义与调用--自定义函数
  • Mysql深入学习:慢sql执行
  • Docker 国内可用镜像
  • ABP VNext + Quartz.NET vs Hangfire:灵活调度与任务管理
  • [嵌入式embed]C51单片机STC-ISP提示:正在检测目标单片机
  • 深度学习(鱼书)day10--与学习相关的技巧(后两节)
  • LWIP从FreeRTOS到uC/OS-III的适配性改动
  • 第六章第三节 TIM 输出比较
  • 关于Web前端安全防御之安全头配置
  • 位运算在权限授权中的应用及Vue3实践
  • 深入理解Java中String.intern()方法:从原理到并发控制实践
  • ElementUI常用的组件展示
  • 高质量数据集|大模型技术正从根本上改变传统数据工程的工作模式
  • Android 之 串口通信
  • zookeeper分布式锁 -- 读锁和写锁实现方式
  • 【Android】RecyclerView循环视图(2)——动态加载数据