- Threads Limitation
- 結論
- 一個程式能跑多少個thread還得視程式所運行環境的記憶體大小)
- 每個thread有各自的stack,一旦使用超過stack大小也會crash,但你可以透過pthread_setstack(), pthread_getstack()來修改stack大小,但同時你就得自行承擔記憶體錯誤的風險。
- 一個程式有多少個thread效能才好,基本上thread的數量不宜多,一般來講最佳化的情況是在同一個時間內有同等於你的核心數量的thread,例如你是8核心cpu,那你的程式同時間使用8個thread的效果是最好的。
Download :threadlimit.c
在MultiThreading Programming裡一個很重要的議題就是Threads Limitation,究竟一個程式的最多可以分配多少個Threads?又一個Threads的Stack大小佔多少?該分配多少個Threads才能 將效能提到最高?這些問題都是程式設計師在做MultiThreading Programming感到痛苦的問題,往往為了要符合這些環境設定,程式的結構也因此被修改得很亂。底下是一個簡單的小程式用來測試你的電腦能開多少個 Threads:
這裡我們預設最大thread數為10000,以及最大遞迴呼叫次數為100次,還有最大變數大小80K(8192*10=8192*1000/100)。我們的主程式如下:
這是一個很基本的multithreading的程式,只是這裡使用了pthread_detach()來取代pthread_join(),以及pthread_attr_getstacksize()來取得stack的大小資訊(同樣的你也可以在terminal裡輸入ulimit -a看stack的資訊)。呼叫的函式如下:
在我的測試電腦裡stack為8MB(2^23 bytes)上限,而我產生了第383個thread時則返回如上的錯誤,而383這個數字是怎麼來的,我概略算了一下。我的記憶體為2GB, SWAP:1GB,所以總共是3GB( 3*(2^30) bytes),所以理論上thread的數量會是:
3*(2^30)/2^23 等於384(384是個概略值,你還得扣掉一些記憶體的消耗)。所以我的系統會在383的地方停止產生thread。
如果你將原始碼裡的MAX_STACK_SIZE加大,你就會得到segmemtation fault,stack overflow的問題你可以參考這一篇[C/C++] Stack Overflow
當然MultiThreading程式的效能並不能單單就以threads的數量而定,因為在實際的設計案例中,每個thread的結束時間並不一定一樣(concurrent programming)自然有些thread必須去等待其他thread來做結合,所以有很大的機會你的MultiThreading的程式跑的比single threading程式還要慢。
網路上有許多已經實做出來的Thread API,其中較具有名氣的OpenMP就是設計來提昇簡易的Parallel的程式效能,有機會我會再用幾篇來探討OpenMP。