2011-04-30 109 views
3

我正在開發一個處理客戶端連接的應用程序。我爲每個請求產生一個線程,因爲會有短的任務。但是,在處理一定數量的連接後,我仍然遇到問題。具體而言,在381個連接之後,pthread_create無法創建新線程。我知道如果應用程序資源耗盡,或者已經創建了超過PTHREAD_THREADS_MAX個線程,這可能會失敗。創建幾個線程後Pthread_create失敗

奇怪的是第一個381個線程在發生此錯誤時已經停止。我沒有使用pthread_join來等待這些線程停止,我相信pthreads並不要求我以某種方式「停止」線程,如果我錯了,請糾正我(至少manpage沒有提到這一點)。我想也許這可能是當幾個線程同時產生時產生的,然而,我已經多次測試過它,並且每次創建第382線程失敗。

有誰知道會發生什麼?任何幫助將不勝感激。

在此先感謝。

回答

4

如果你不叫pthread_join或分離線程(通過調用pthread_detach或使用屬性分離狀態創造它),由終止線程使用的資源將永遠不會被釋放。這是你的問題。如果您不需要加入您的話題,請在創建話題時立即將其分離。

+0

謝謝!我不知道這件事。我現在就試一試。 – mfontanini 2011-04-30 20:33:04

+0

好的,我已經達到了450多個pthread產生,所以我想這是問題所在。非常感謝! – mfontanini 2011-04-30 20:41:28

+3

請注意,默認情況下,glibc/NPTL爲每個線程(通常爲8-10MB)使用*非常大的堆棧大小,這就是381線程之後用完虛擬地址空間(32位)的原因。假設你不需要這麼多,創建一個屬性對象並使用'pthread_attr_setstacksize'來選擇一個更小的堆棧大小(大多數用途中64k應該足夠了)將會節省大量資源,並降低'pthread_create'失敗的風險if許多線程仍在運行。然後你也可以預先設置detached屬性,所以你不必調用'pthread_detach'。 – 2011-04-30 20:48:51