2015-08-25 136 views
2

有人可以向我解釋爲什麼下面的程序創建7185線程而不是7455?getrlimit()返回錯誤的值?

void *thr_crt(void *arg) 
{ 
    sleep(64); 
    return 0; 
} 

int main(void) 
{ 
    struct rlimit lim; 
    int err; 
    int i; 

    pthread_t tid; 

    if(getrlimit(RLIMIT_NPROC, &lim) < 0) 
     perror("getrlimit error"), exit(1); 

    i = 1; 
    while(pthread_create(&tid, NULL, thr_crt, NULL) == 0) 
     i++; 

    printf("soft limit: %d\n", lim.rlim_cur); 
    printf("hard limit: %d\n", lim.rlim_max); 
    printf("threads %d\n", i-1); 

    return 0; 
} 

輸出:

軟限制:7455
硬性限制:7455個
螺紋7185

它不應該創建線程7455?

+1

只是說明:是不是'rlim_t'類型無符號? –

回答

3

最大線程數RLIMIT_NPROC是(IIRC)每個「真實」用戶ID,而不是每個進程,所以有意義的是,每個進程有點低一些,因爲其他已經運行的進程具有相同的「真實」用戶ID或者作爲防止快速資源枯竭的某種保護措施。

1

檢查/proc/sys/kernel/threads-max,因爲它可能低於允許的進程。