Linux下能夠建立的最大執行緒數

2021-07-06 02:11:15 字數 999 閱讀 6650

1. 首先可以執行下面的程式檢查,檢查你現在的系統總共能建立多少個執行緒。我的系統上是i=380,也就是最多能建立380個執行緒。後面分析為什麼是它。

// maxthread.cc , compile: gcc maxthread.cc -o thread -lpthread

include

#include

#include

static void *foo( void * ptr);

int main()

return 0;

}void *foo(void * ptr)

2. 棧大小的限制,執行下面程式:

int main(int argc, char * argv)

在我的機器上得到結果:segment ation fault.

3. 檢查ulimit -a 的結果,檢視stack size:

stack size              (kbytes, -s) 8192

8192kb 就是棧的大小。不能超過這個棧的數目,因此上面2)分配的buf大小超過了棧限制,得到了setmentation fault。

4. linux上,最大執行緒數目是:

number of threads = total virtual memory / (stack size*1024*1024)

在32位系統上,程序空間是4g,其中0-3g是使用者空間(0x0-0xbfffffff), 3g-4g是核心空間。

因此理論上講,使用者空間大小/棧大小=最大執行緒數。3072m/8m=384,考慮到系統的占用,主線程等,我的系統上是380. 也許在你的系統上是382.

5. 根據4),我們可以減小棧限制或者增大虛擬記憶體使得執行緒的數目增加。

檢查虛擬記憶體: ulimit -v

檢查棧大小: ulimit -s

設定虛擬記憶體:ulimit -v 新值

設定棧大小: ulimit -s 新值

參考:

Linux最大執行緒數限制

開始以為是記憶體不足導致無法建立執行緒,把jvm的 xms,xmx的2個引數都加大一倍 xms2048m xmx2048m。把 xss引數調小,還是啟動失敗。應該是系統方面的限制了,這台機器上搞了100個過tomcat程序,還有不少其他軟體,東西比較多且雜。確認過機器的記憶體還是足夠的,先排查系統引...

執行緒池的核心執行緒與最大執行緒

1 當提交乙個新任務到執行緒池時首先執行緒池判斷基本執行緒池 corepoolsize 是否已滿?沒滿,建立乙個工作執行緒來執行任務。滿了,則進入下個流程 其次執行緒池判斷工作佇列 workqueue 是否已滿?沒滿,則將新提交的任務儲存在工作佇列裡。滿了,則進入下個流程 最後執行緒池判斷整個執行緒...

C 程序中最大執行緒建立數量分析

thread th newthread opthread th.isbackground true th.start private void opthread catch system.exception ex finally region 最大執行緒測試 list lstthread new l...