原文地址: http://blog.sina.com.cn/s/blog_6a42728a0100zst9.html
Pthread_create创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下:
-bash-3.00$ ulimit -s
8192
-bash-3.00$
上述表示为8M; 单位为KB,即8192KB。
也可以通过ulimit –a 查看其中的stack size项,此项也表示堆栈大小。
ulimit –s value可以用来重新设置stack大小。
一般来说 默认堆栈大小为8388608 ,公司的linux服务器上目前好像是10485760;堆栈最小大小为16384。单位为字节Byte。
堆栈最小值定义为PTHREAD_STACK_MIN,包含在头文件#include <limits.h>中。
对于当前使用值,可以通过pthread_attr_getstacksize(&attr,&stack_size)获取,并通过打印stack_size来查看。
对于嵌入式,由于内存不是很大,若采用默认值的话,会导致出现问题,若内存不足,则pthread_create会返回12.
定义宏如下:
#define EAGAIN 11
#define ENOMEM 12
上面了解了堆栈大小,下面就来了解如何使用pthread_attr_getstacksize和pthread_attr_setstacksize来查询和设置堆栈大小。先看它的原型:
#include<pthread.h>
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
attr 是线程属性变量;stacksize 则是设置的堆栈大小。 返回值0,-1分别表示成功与失败。
#include <iostream>
#include <limits.h>
#include <pthread.h>
#include "error.h"
using namespace std;
int main(){
pthread_t thread;
size_t stacksize;
pthread_attr_t thread_attr;
int ret;
pthread_attr_init(&thread_attr);
int new_size = 20480;
ret = pthread_attr_getstacksize(&thread_attr,&stacksize);
if(ret != 0){
cout << "emError" << endl;
return -1;
}
cout << "stacksize=" << stacksize << endl;
cout << PTHREAD_STACK_MIN << endl;
ret = pthread_attr_setstacksize(&thread_attr,new_size);
if(ret != 0)
return -1;
ret = pthread_attr_getstacksize(&thread_attr,&stacksize);
if(ret != 0){
cout << "emError" << endl;
return -1;
}
cout << "after set stacksize=" << stacksize << endl;
w
ret = pthread_attr_destroy(&thread_attr);
if(ret != 0)
return -1;
return 0;
}
输出:
-bash-3.00$ g++ -g thread.cpp -o a -l pthread
-bash-3.00$ ./a
stacksize=8388608
16384
after set stacksize=20480