getrlimit() returns 错误的值?

getrlimit() returns wrong value?

谁能给我解释一下为什么下面的程序创建了 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;
}

输出:

soft limit: 7455
hard limit: 7455
threads 7185

它不应该创建 7455 个线程吗?

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

最大线程数 RLIMIT_NPROC 是每个 "real" 用户 ID 而不是每个进程的 (IIRC),因此每个进程的最大线程数要低一些是有道理的,因为其他已经 运行 具有相同 "real" 用户 ID 的进程或作为某种防止资源快速耗尽的保护措施。