【Linux系统编程】线程栈大小
生活随笔
收集整理的這篇文章主要介紹了
【Linux系统编程】线程栈大小
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 設置線程棧函數
- 03. 附錄
01. 概述
先來講說線程內存相關的東西,主要有下面幾條:
- 進程中的所有的線程共享相同的地址空間。
- 任何聲明為 static/extern 的變量或者堆變量可以被進程內所有的線程讀寫。
- 一個線程真正擁有的唯一私有儲存是處理器寄存器。
- 線程棧可以通過暴露棧地址的方式與其它線程進行共享。
有大數據量處理的應用中,有時我們有必要在棧空間分配一個大的內存塊或者要分配很多小的內存塊,但是線程的棧空間的最大值在線程創建的時候就已經定下來了,如果棧的大小超過個了個值,系統將訪問未授權的內存塊,毫無疑問,再來的肯定是一個段錯誤。
pthread_create()創建線程時,若不指定分配堆棧大小,系統會分配默認值,通過命令查看方法如下:
上面的單位為 Kb,所以,線程默認堆棧大小為 8M。
也可以在終端下通過 ulimit -s value 用來重新設置 stack 大小。
一般來說,默認堆棧大小為 8388608,堆棧最小為 16384, 單位為字節。在某些嵌入式系統中,如果其內存不是很大,若采用默認值的話,會導致出現問題,若內存不足,則 pthread_create() 會返回 12,其定義如下:
#define EAGAIN 11#define ENOMEM 12 /* Out of memory */02. 設置線程棧函數
可以使用 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");return -1;}//獲取當前的線程棧大小ret = pthread_attr_getstacksize(&attr, &stack_size);if(ret != 0){perror("pthread_attr_getstacksize");return -1;}//打印堆棧值printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);return 0; }執行結果:
deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c -pthread deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out stack_size = 8388608B, 8192k deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$設置線程堆棧大小示例代碼如下:
#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; }執行結果:
deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out stack_size = 20480B, 20k deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$03. 附錄
3.1 博客: 線程堆棧大小 pthread_attr_setstacksize 的使用
3.2 博客: pthread之線程堆棧
總結
以上是生活随笔為你收集整理的【Linux系统编程】线程栈大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux系统编程】线程基本操作
- 下一篇: 【Linux系统编程】线程私有数据