版權聲明:本文為博主原創文章,未經博主允許不得轉載。
在網上看到有朋友討論,一個進程能創建的線程的最大數量,我學習了一下,做了這個小實驗。
理論上,一個進程可用虛擬空間是2G,默認情況下,線程的棧的大小是1MB,所以理論上最多只能創建2048個線程。如果要創建多於2048的話,必須修改編譯器的設置。怎么設置呆會兒再說。
在VC下寫了一個控制台程序,目的很簡單,就是創建4500個線程程
代碼如下:
- #include <windows.h>
- #include <process.h>
- #include <stdio.h>
- HANDLE hProcess ;
- HANDLE hThread ;
- < /li>
- DWORD WINAPI athread( void ) //線程函數
- {
- WaitForSingleObject( hProcess, INFINITE ) ;
- return 0 ;
- }
- bool createThread( int threadNum ) //參數表示創建的線程數
- {
- int i ;
- hProcess = GetCurrentProcess();
- for( i = 0; i < threadNum; i++ )
- {
- hThread = NULL ;
- hThread = (HANDLE)_beginthreadex( NULL, 0, (unsigned int (__stdcall *)(void *))athread, NULL, NULL, NULL ) ;
- if( hThread != NULL )
- {
- printf("/rThe Number of Thread : %d ", i+1 ) ;
- }else{
- printf("/nError : Create Thread Fail./n") ;
- return false ;
- }
- }
- return true ;
- }
- int main()
- {
- printf("Test : How much thread a process can create./n") ;
- createThread( 4500 ) ;
- getchar();
- return 0 ;
- }
為了不影響性能,線程不做任何操作,等待進程終止,在進程沒有終止之前,,建立好的線程始終被掛起。
默認情況下,在我的機子上,創建到2024個進程時提示錯誤。
現在來講如何設置棧的大小。我用的是vc2005。
菜單欄的“項目”->“***屬性”,選擇“配置屬性”下的“鏈接器”下的“系統”,將堆棧保留大小設置為:524288,這個值就是512KB,這里的單位是字節,所以要自己換算,這樣理論上能創建4096個進程。
再次編譯,運行,這個時候創建到了4031個線程時失敗,大約是原來的兩倍,因為主線程要占用一定的內存,這個結果是正常的。
結論是:一個進程可以創建的線程數由可用虛擬空間和線程的棧的大小共同決定,只要虛擬空間足夠,那么新線程的建立就會成功。如果需要創建超過2K以上的線程,減小你線程棧的大小就可以實現了,雖然在一般情況下,你不需要那么多的線程。