【问题标题】:getrlimit() returns wrong value?getrlimit() 返回错误值?
【发布时间】:2015-11-19 04:56:50
【问题描述】:

有人可以向我解释一下为什么下面的程序会创建 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个线程吗?

【问题讨论】:

  • 请注意:rlim_t 类型不是无符号的吗?

标签: c multithreading unix system-calls


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-03
      • 2015-06-19
      • 2014-01-16
      • 2019-10-13
      • 2020-10-05
      • 2020-05-27
      • 2017-04-16
      • 2017-08-26
      相关资源
      最近更新 更多