线程堆栈

本文介绍了在使用pthread_create创建线程时,默认堆栈大小及其调整方法。默认情况下,系统分配的堆栈大小为8MB(8388608字节),可通过pthread_attr_setstacksize函数调整这一值。文章提供了具体的代码示例。

pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下:

# ulimit -s
8192
#

上述表示为8M;单位为KB

也可以通过# ulimit -a 其中 stack size 项也表示堆栈大小。ulimit -s  value 用来重新设置stack 大小。

一般来说 默认堆栈大小为 8388608; 堆栈最小为 16384 。 单位为字节。

堆栈最小值定义为 PTHREAD_STACK_MIN ,包含#include <limits.h>后可以通过打印其值查看。对于默认值可以通过pthread_attr_getstacksize (&attr, &stack_size); 打印stack_size来查看。

尤其在嵌入式中内存不是很大,若采用默认值的话,会导致出现问题,若内存不足,则 pthread_create 会返回 12,定义如下:

#define EAGAIN 11

#define ENOMEM 12 /* Out of memory */

上面了解了堆栈大小,下面就来了解如何使用 pthread_attr_setstacksize 重新设置堆栈大小。先看下它的原型:

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

attr 是线程属性变量;stacksize 则是设置的堆栈大小。 返回值0,-1分别表示成功与失败。

这里是使用方法

  pthread_t thread_id;

  int ret ,stacksize = 20480; /*thread 堆栈设置为20K,stacksize以字节为单位*/

  pthread_attr_t attr;
  ret = pthread_attr_init(&attr); /*初始化线程属性*/

  if (ret != 0)

      return -1;
  ret = pthread_attr_setstacksize(&attr, stacksize);

  if(ret != 0)

      return -1;
  ret = pthread_create (&thread_id, &attr, &func, NULL);

  if(ret != 0)

      return -1;
  ret = pthread_attr_destroy(&attr); /*不再使用线程属性,将其销毁*/

  if(ret != 0)

    return -1;

Java线程堆栈的实践方法包含打印线程堆栈与分析线程堆栈两方面: - **打印线程堆栈**:引用中未提及具体打印线程堆栈的代码实践,但在Java里,能借助`Thread.getAllStackTraces()`方法获取所有线程堆栈信息。以下是示例代码: ```java import java.util.Map; import java.util.concurrent.TimeUnit; public class ThreadStackPrinter { public static void main(String[] args) { // 创建一个新线程 Thread newThread = new Thread(() -> { try { // 让新线程休眠5秒 TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } }); // 启动新线程 newThread.start(); // 获取所有线程堆栈信息 Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); for (Map.Entry<Thread, StackTraceElement[]> entry : allStackTraces.entrySet()) { Thread thread = entry.getKey(); StackTraceElement[] stackTrace = entry.getValue(); System.out.println("线程名: " + thread.getName()); for (StackTraceElement element : stackTrace) { System.out.println(" " + element); } } } } ``` - **分析线程堆栈**: - **查看线程基本信息**:从线程堆栈获取线程的名字、id、数量、运行状态等。例如查看线程个数可直接统计,运行状态和锁状态等则要结合线程堆栈特定标识分析。 - **分析调用堆栈**:方法的调用栈关系一般从下往上看。调用堆栈涵盖整类名、执行方法、源代码行数,借此可了解线程调用顺序和逻辑。 - **分析锁状态**:当一个线程占有一个锁时,线程堆栈会打印`-locked<0x22bffb60>`;当一个线程正在等待其他线程释放该锁,会打印`-waiting to lock<0x22bffb60>`;当一个线程占有一个锁,但又执行在该锁的`wait`上,线程堆栈中首先打印`locked`,然后打印`-waiting on <0x22c03c60>` [^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值