linux建立執行緒失敗的原因是執行緒棧大小的設定

2021-06-20 23:40:10 字數 927 閱讀 9588

執行緒應用程式最常見導致建立執行緒失敗的原因是執行緒棧大小的設定。建立乙個新的執行緒,預設情況下系統為執行緒棧預留了2mb的定址空間。執行緒棧起始於程序虛擬 記憶體的高階位址,並向虛擬記憶體底端位址方向擴充套件。取決於執行緒本身的大小以及其它執行緒記憶體分配的情況,程序虛擬位址空間消耗過快可能導致建立執行緒失敗。

這裡有乙個測試程式可以看到,linux下最多可以建立多少個執行緒。

#include

#include

#include

void *threadfunc()

main(void) 

}}輸出結果如下:

create thread 301

create thread 302

can't create thread: cannot allocate memory

用 ulimit -s 可以檢視到棧的預設大小為10240k

32位linux下的程序使用者空間是3072m, 3072/10.24=300。為什麼實際會比計算出來的多2個,這個原因還不太清楚。

可以在呼叫 pthread_create 的時候用 pthread_attr_getstacksize 設定棧的大小,或者直接用 ulimit -s 設定棧的大小。

如果修改上面的測試**為

#include

#include

#include

void *threadfunc()

main(void) 

}}那麼得到的結果將是:

create thread 560000

create thread 560001

……………

這裡用到了pthread_detach (pthread_self())來釋放執行緒所占用的記憶體資源(執行緒核心物件和執行緒堆疊)。這樣就可以建立更多的執行緒,而不會出現cannot allocate memory的錯誤。

Adprep無法完成原因是回叫功能失敗

問題描述 嘗試將windows 2012 r2的一台成員伺服器提公升為windows 2003域的域控時,無法完成,報錯資訊如下 ldap api ldap search s 已完成,返回 為 0x20adprep 驗證了操作 cn 134428a8 0043 48a6 bcda 63310d9ec...

區域性變數是執行緒安全的,原因是什麼?

摘要 很多小夥伴都知道區域性變數是執行緒安全的,那你知道為什麼區域性變數是執行緒安全的嗎?多個執行緒同時訪問共享變數時,會導致併發問題。那麼,如果將變數放在方法內部,是不是還會存在併發問題呢?如果不存在併發問題,那麼為什麼不會存在併發問題呢?記得上學的時候,我們都會遇到這樣一種題目,列印斐波那契數列...

李廣致死未封侯的原因 是長相不佳

量小非君子,無毒不丈夫 這兩句話都誰說的啊,我覺得該給漢武帝用上,而且我認為是他親手殺了李廣。雖然給這個治世奇才雄才大略四個字,但是他也是個以貌取人的主兒。匈奴最尊敬的將軍李廣,匈奴聞風喪膽綽號 飛將軍 感覺確實有些氣魄 漢武大帝中對李廣的鏡頭少之又少,這個從官兵起家,一步一步走向將軍的李廣,臨死都...