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;