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 的进程或作为某种防止资源快速耗尽的保护措施。
谁能给我解释一下为什么下面的程序创建了 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 的进程或作为某种防止资源快速耗尽的保护措施。