參考資料:
http://blog.csdn.net/xhhjin/article/details/7579145
總結:
1、進程的棧大小是在進程執行的時刻才能指定的,即不是在編譯的時候決定的,也不是在鏈接的時候決定的
2、進程的棧大小是隨機確定的至少比線程棧要大,但是不到線程棧大小的2倍
3、線程棧大小是固定的,也就是ulimit -a 顯示的值
查看線程棧大小:
可以看到默認情況下線程棧大小為8192(8MB),可以使用ulimit -s xxx修改線程默認棧大小
(1)檢查線程棧默認大小(8KB)
線程執行2030次之后,出現段錯誤(2030*4K=8120K)
(2)修改棧大小,使用pthread_attr_setstack()
如上修改棧大小為16MB,其中線程棧的空間從堆中進行分配
程序執行4063次后出現段錯誤(4063*4KB)
(3)創建兩個線程,使用默認棧大小執行
創建兩個線程,默認單個線程棧大小為8M
執行結果1:程序執行4009次之后段錯誤(4009*4KB)
執行結果2:程序執行3380次之后段錯誤(3380*4KB)
總結:
兩個線程時,兩個線程棧的總和不是固定值,也不是線程棧的2倍
(3)不使用任何線程
執行結果1:程序執行2538次后段錯誤(2538*4KB)
執行結果2:程序執行2537次后段錯誤(2537*4KB)
總結:
進程的棧大小不是固定的,而是比線程棧大一些
(4)線程棧從進程棧中分配
執行結果1: 程序執行2536次后段錯誤(2536*4KB>8M)
執行結果2:程序執行2537次后段錯誤(2537*4KB>8M)
總結:
線程從進程棧分配空間,大小並不是固定的,如果分配空間大於進程棧空間,那么直接運行時出現段錯誤。
關於進程棧和線程棧總結:
(1)進程棧大小時執行時確定的,與編譯鏈接無關
(2)進程棧大小是隨機確認的,至少比線程棧要大,但不會超過2倍
(3)線程棧是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改














