线程堆栈大小 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;

时间: 2024-10-21 15:40:41

线程堆栈大小 pthread_attr_setstacksize 的使用的相关文章

深入JVM剖析Java的线程堆栈_java

在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息. 我的目标是分享我过去十几年来在线程分析中积累的知识和经验.这些知识和经验是在各种版本的JVM以及各厂商的JVM供应商的深入分析中获得的,在这个过程中我也总结出大量的通用问题模板. 那么,准备好了么,现在就把这篇文章加入书签,在后续几周中我会给大家带来这一系列的专

new,is和as运算符解析及运行时类型,对象,线程堆栈,托管堆之间的联系

CLR要求对象必须使用new运算符创建,在使用new运算符创建一个对象时具体都做了些什么呢? 1.计算所有定义的实例字段,所有的基类型包括System.Object需要分配的字节数. 每一个堆上的对象还需要两个额外的成员:类型对象指针 和同步块索引,CLR使用它们来管理对象.它们两个需要的字节数算在对象的大小里面. 2.从托管堆分配对象需要的字节数(也就是给对象分配内存).所有的字节置为0 3.初始化类型对象指针 和同步块索引 4.调用实例构造器.大多数编译器自动生成调用基类构造器的代码.最终会

如何合理地估算线程池大小?

感谢网友[蒋小强]投稿. 如何合理地估算线程池大小? 这个问题虽然看起来很小,却并不那么容易回答.大家如果有更好的方法欢迎赐教,先来一个天真的估算方法:假设要求一个系统的TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s.那么问题转化为: 如何设计线程池大小,使得可以在1s内处理完20个Transaction? 计算过程很简单,每个线程

weblogic 9.2 内存泄露问题 转储线程堆栈

问题描述 最近客户的一个生产环境经常当机,我们的环境是一个主服务,下面有两个收管服务,但时间上只有一个收管服务app1在用,另外一个app2服务只是备用无法访问,有两应用包.主服务的JVM分配512MB,其他连个收管服务各2GB内存空间.今天快下班时app1监控到可用堆栈是0%,点击"转储线程堆栈",显示如下内容,请高手帮忙分析.此页中显示了每个线程的当前堆栈."MultiThreadedHttpConnectionManagercleanup"waitingfor

MFC关于线程堆栈的变量的计算问题

问题描述 MFC关于线程堆栈的变量的计算问题 MFC怎么样定义结构体数组才能让这个结构体数组都放在线程的堆栈上?是不是线程堆栈上的变量的计算不会导致共享的问题? 解决方案 堆栈上的变量不需要同步,因为每个线程有自己的堆栈 具体参考:http://blog.csdn.net/mynote/article/details/5835615 解决方案二: 把数据放到栈上,就是线程独有的,每个线程都访问自己的堆栈数据 解决方案三: 局部变量(在函数内部定义的变量,包括函数的参数)是在堆栈中,正常情况不会导

轻巧的线程堆栈查看工具Hot Threads

定位性能问题,尤其是cpu使用率过高时,经常需要查找cpu消耗较高的线程,然后查看其堆栈,从而进入代码定位问题. 该场景下, jstack+top是一种非常经典的方式. jstack+top jstack+top的一般套路: 1.top -H 查看cpu占用较高的线程,记录十进制的线程id 2.jstack  将线程信息dump到文件中,在文件中根据线程id查找该线程的堆栈. 注意,jstack输出中线程id是16进制的,这里要做一次进制转换. 3.研究这个线程的堆栈 jstack+top方法的

查看Linux进程CPU过高具体的线程堆栈(不中断程序)

1.TOP命令,找到占用CPU最高的进程 $ top  top - 20:11:45 up 850 days,  1:18,  3 users,  load average: 1.04, 1.01, 0.99 Tasks:  61 total,   1 running,  60 sleeping,   0 stopped,   0 zombie Cpu(s):  1.4% us,  0.1% sy,  0.0% ni, 98.3% id,  0.1% wa,  0.0% hi,  0.2% si

JVM:如何分析线程堆栈

英文原文:JVM: How to analyze Thread Dump 在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息. 我的目标是分享我过去十几年来在线程分析中积累的知识和经验.这些知识和经验是在各种版本的JVM以及各厂商的JVM供应商的深入分析中获得的,在这个过程中我也总结出大量的通用问题模板. 那么,准

如何计算tomcat线程池大小?

背景 在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢? 接下来,我将介绍本人是怎么设计以及计算的. 目标 确定tomcat服务器线程池大小 具体方法 众所周知,tomcat接受一个request后处理过程中,会涉及到cpu和IO时间.其中IO等待时,cpu被动放弃执行,其他线程就可以利用这段时间片进行操作. 所以我们可以采用服务器IO优化的通用规则: 线程大小 = ( (线程io时间 + 线程cpu)  / 线程cpu ti