//小watch水平有限,希望大家多多指正文中的錯誤,共同進步
最近在學習os的多執行緒課程,第乙個實驗室關於windows的多執行緒,用mfc實現。實驗蠻簡單的,但是,我不由想到了,乙個程序最多能包含多少個執行緒。
在網上查了查,貌似也沒找到多少這方面的資料。大部分都是關於伺服器多執行緒鏈結sever的,關於本機可執行exe的程序數倒是沒有什麼涉及。
我覺得唯一乙個有用的出處:
中間有一句:個人認為是這樣的:每個程序是有4g的記憶體空間,其種只有一部分是給使用者使用的,其餘是核心使用的,具體多少跟作業系統有關。程序中的所有執行緒公用這一空間。每個執行緒又自己的堆疊,再win2k下,如果用vc寫程式的話,你能使用的位址空間約為2g,,執行緒的預設堆疊是1m,可以在編譯程式時修改。因此可以推算乙個程序的執行緒數也就兩千多個。
機器配置:虛擬機器 +xp +1g記憶體
廢話不多說,直接上圖。
主要用乙個全域性變數 i 標識下,並在i%1000 == 0,時,用getchar()中斷下。
出來的結果並不是我想像中的那樣子。
可以看到pid變得非常非常大,這也讓我的機器變得特別卡,這個原因可能就是之前的程式中,建立的執行緒對應的控制代碼被大量占用,但卻沒有被釋放。
但是,這和我想要的結果相差很多,再檢查,發現執行緒是void,執行完io操作後,直接就退出掛起了。於是改動如下:
ok,這下應該差不多了。。執行
然後到這裡,我的虛擬機器完全卡住了~~ ⊙﹏⊙b汗
再等一會。。
直接不響應了!!
好吧,到這邊,基本上,可以總結下了。
1.程序中,執行緒的**執行完直到返回,執行緒的生命週期基本就算結束了,之後不會占用cpu。但是如果用於標識的執行緒控制代碼不釋放的話,那麼之後執行其它程序時分配的pid就會特別大,計算機也會變得特別卡。
乙個程序最多能開多少個執行緒?
在x86平台32位系統,系統占用2gb位址空間,使用者方式2gb。如果使用vs,鏈結程式開關 sack 或者 f可以設定執行緒堆疊大小,預設分配乙個執行緒的堆疊大小是1mb,當createthread引數的stacksize大小與鏈結程式設定的不一致時,採用的方法是誰大用誰的,所以用4kb修改當然不...
乙個程序可以建立多少執行緒
理論上,乙個程序可用虛擬空間是2g,預設情況下,執行緒的棧的大小是1mb,所以理論上最多只能建立2048個執行緒。如果要建立多於2048的話,必須修改編譯器的設定。include include includehandle hprocess handle hthread dword winapi a...
實驗 乙個程序到底能建立多少執行緒?
from 在網上看到有朋友討論,乙個程序能建立的執行緒的最大數量,我學習了一下,做了這個小實驗。理論上,乙個程序可用虛擬空間是2g,預設情況下,執行緒的棧的大小是1mb,所以理論上最多只能建立2048個執行緒。如果要建立多於2048的話,必須修改編譯器的設定。怎麼設定呆會兒再說。在 下寫了乙個控制台...