getrlimit()返回错误的值?

时间:2015-08-25 13:05:09

标签: c multithreading unix system-calls

有人可以向我解释为什么以下程序会创建7185个线程而不是7455吗?

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个线程?

2 个答案:

答案 0 :(得分:3)

最大线程数RLIMIT_NPROC是(IIRC)per&#34; real&#34;用户ID,而不是每个进程,所以它是有意义的,因为其他已经运行的进程具有相同的&#34;真正的&#34;用户ID或某种防止快速资源耗尽的保护。

答案 1 :(得分:1)

检查/proc/sys/kernel/threads-max,因为它可能低于允许的进程。