线程栈大小设置pthread_attr_setstacksize()

原文地址: 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 中。

对于当前使用值,可以通过pthread_attr_getstacksize(&attr,&stack_size)获取,并通过打印stack_size来查看。

对于嵌入式,由于内存不是很大,若采用默认值的话,会导致出现问题,若内存不足,则pthread_create会返回12.

定义宏如下:

#define  EAGAIN 11

#define ENOMEM 12

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

#include

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 

#include 

#include 

#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

你可能感兴趣的:(线程栈大小设置pthread_attr_setstacksize())