執行緒應用程式最常見導致建立執行緒失敗的原因是執行緒棧大小的設定。建立乙個新的執行緒,預設情況下系統為執行緒棧預留了2mb的定址空間。執行緒棧起始於程序虛擬 記憶體的高階位址,並向虛擬記憶體底端位址方向擴充套件。取決於執行緒本身的大小以及其它執行緒記憶體分配的情況,程序虛擬位址空間消耗過快可能導致建立執行緒失敗。
這裡有乙個測試程式可以看到,linux下最多可以建立多少個執行緒。
#include
#include
#include
void *threadfunc()
main(void)
} }輸出結果如下:
create thread 301
create thread 302
can't create thread: cannot allocate memory
用ulimit -s 可以檢視到棧的預設大小為10240k
32位linux下的程序使用者空間是3072m,3072/10.24=300。為什麼實際會比計算出來的多2個,這個原因還不太清楚。(編者注:準確演算法是(3072*1024k)/10240k=307.2,實際會比計算出來的少5.2個)
可以在呼叫pthread_create 的時候用pthread_attr_getstacksize 設定棧的大小,或者直接用ulimit -s 設定棧的大小。
如果修改上面的測試**為
#include
#include
#include
void *threadfunc()
main(void)
} }那麼得到的結果將是:
create thread 560000
create thread 560001
……………
這裡用到了pthread_detach(pthread_self())來釋放執行緒所占用的記憶體資源(執行緒核心物件和執行緒堆疊)。這樣就可以建立更多的執行緒,而不會出現cannot allocate memory的錯誤。
如果程序中的某個執行緒執行了pthread_detach(th),則th執行緒將處於detached狀態,這使得th執行緒在結束執行時自行釋放所占用的記憶體資源。乙個可join的執行緒所占用的記憶體僅當有執行緒對其執行了pthread_join()後才會釋放,因此為了避免記憶體洩漏,所有執行緒的終止,要麼已設為detached,要麼就需要使用pthread_join()來**
pthread create(執行緒建立)
pthread create 執行緒建立 1 標頭檔案 include 2 函式原型 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg 3 函式形參 threa...
執行緒建立函式pthread create
標頭檔案 include b函式原型 int pthread created pthread t thread,pthread attr t attr,void start routine void void arg 函式引數含義 thread 該引數是乙個指標,當執行緒建立成功時,用來返回建立的執...
使用pthread create 建立執行緒
可以通過pthread create 函式建立新執行緒。include int pthread create pthread t restrict tidp,const pthread attr t restrict attr,void start rtn void void restrict ar...