線程堆棧大小 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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章