【Linux系统编程】线程堆栈大小的使用介绍
生活随笔
收集整理的這篇文章主要介紹了
【Linux系统编程】线程堆栈大小的使用介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先來講說線程內存相關的東西,主要有下面幾條:
- 進程中的所有的線程共享相同的地址空間。
- 任何聲明為 static/extern 的變量或者堆變量可以被進程內所有的線程讀寫。
- 一個線程真正擁有的唯一私有儲存是處理器寄存器。
- 線程棧可以通過暴露棧地址的方式與其它線程進行共享。
有大數據量處理的應用中,有時我們有必要在棧空間分配一個大的內存塊或者要分配很多小的內存塊,但是線程的棧空間的最大值在線程創(chuàng)建的時候就已經定下來了,如果棧的大小超過個了個值,系統將訪問未授權的內存塊,毫無疑問,再來的肯定是一個段錯誤。
pthread_create()創(chuàng)建線程時,若不指定分配堆棧大小,系統會分配默認值,通過命令查看方法如下:
上面的單位為 Kb,所以,線程默認堆棧大小為 8M。
也可以在終端下通過?ulimit -s ?value?用來重新設置 stack 大小。
一般來說,默認堆棧大小為 8388608,堆棧最小為 16384, 單位為字節(jié)。在某些嵌入式系統中,如果其內存不是很大,若采用默認值的話,會導致出現問題,若內存不足,則 pthread_create() 會返回 12,其定義如下:#define EAGAIN 11#define ENOMEM 12 /* Out of memory */
我們用 pthread_attr_getstacksize() 和 pthread_attr_setstacksize() 的方法來查看和設置線程的堆棧空間。
查看線程堆棧大小示例代碼如下:#include <stdio.h> #include <stdlib.h> #include <pthread.h>//線程操作所需頭文件int main(void) {size_t stack_size = 0; //堆棧大小變量pthread_attr_t attr; //線程屬性結構體變量//初始化線程屬性int ret = pthread_attr_init(&attr);if(ret != 0){perror("pthread_attr_init");}//獲取當前的線程棧大小ret = pthread_attr_getstacksize(&attr, &stack_size);return -1;if(ret != 0){perror("pthread_attr_getstacksize");return -1;}//打印堆棧值printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);return 0; }
編譯代碼時,需要加上?-lpthread,運行結果如下:
設置線程堆棧大小示例代碼如下:#include <stdio.h> #include <stdlib.h> #include <pthread.h>//線程操作所需頭文件int main(void) {size_t stack_size = 0; //堆棧大小變量pthread_attr_t attr; //線程屬性結構體變量//初始化線程屬性int ret = pthread_attr_init(&attr);if(ret != 0){perror("pthread_attr_init");return -1;}stack_size = 1024*20; //堆棧大小設置為20Kret = pthread_attr_setstacksize(&attr, stack_size);//設置線程堆棧大小if(ret != 0){perror("pthread_attr_getstacksize");return -1;}stack_size = 0;ret = pthread_attr_getstacksize(&attr, &stack_size);//獲取線程堆棧大小//打印堆棧值printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);return 0; }
運行結果如下:
參考資料:http://www.cnblogs.com/qq78292959
http://blog.csdn.net/horstlinux
總結
以上是生活随笔為你收集整理的【Linux系统编程】线程堆栈大小的使用介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux系统编程】线程与进程的比较
- 下一篇: 【C语言】Linux内核源码--min,