關於線程堆棧大小的注意事項

    今天在給車綜的SDK作測試時,遇到了一個線程崩潰的問題。大概情形是我 用車綜的SDK封裝了一個類,在一個線程中定義了一個這個類的對象,而後再線程啓動的時候,在線程的入口處即致使崩潰。然而以指針的形式來定義則沒有問題。經大神指出是由於每一個線程對於所使用的堆棧大小是有限制的,個人這個類對象佔用的堆棧超出了限制。html

    如下資料參考博客關於線程堆棧大小的注意事項  數組

每一個線程獨立擁有一個可配置大小的堆棧,一個線程內全部函數使用到的堆棧都依賴於這個棧,若是太多的變量、參數須要使用棧,則可能致使棧溢出。目前基礎平臺子系統經過配置環境變量,將默認堆棧大小設置爲128K,能夠減小這個問題的出現,但業務系統在編碼時仍然 須要注意棧的使用,避免出現問題。函數

    包括:
    一、不要在函數內部定義過大的局部變量,如過大的結構體變量,聯合變量,過大的字符串,數組等;
    二、函數調用的深度也須要注意,若是函數 A 調用 B, B 再調用 C,而A/B/C每一個函數定義了 10 K的局部變量,則總的棧空間需求將超過 30K;
    三、不要直接將大的結構變量經過函數參數傳遞,這樣也會消耗棧空間,能夠經過指針或者引用的方式傳遞;
    四、建議每一個函數內部定義的變量大小控制在4-8K如下;
    五、若是在運行中 COREDUMP,而且經過 GDB 的 WHERE 命令時看到剛進入某個函數就報錯,連函數內的第一條調試語句都沒法指向,則基本能夠認爲是棧空間不夠致使的,能夠嘗試將棧空間配置大一點,若是問題再也不出現,則能夠肯定問題。這時須要按照前面幾點的要求修改代碼,減小棧的使用。 測試


這讓我想起了以前在作英偉達硬解時,在線程內分配顯存會致使崩潰,而把分配顯存移到線程外則沒有問題。大神猜想說是線程對顯存的分配有限制。   在此一併記錄。編碼


另外一篇關於修改線程堆棧大小博客設置線程堆棧大小.net

相關文章
相關標籤/搜索