2015-08-25 154 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,因为它可能低于允许的进程。