2015-08-25 3 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) на «настоящий» идентификатор пользователя, а не на каждый процесс, поэтому имеет смысл, что он несколько ниже для каждого процесса либо из-за других уже запущенных процессов с тем же «реальным» идентификатором пользователя или как некоторая защита от быстрого истощения ресурсов.

1

Проверьте /proc/sys/kernel/threads-max, так как он может быть ниже разрешенных процессов.

Смежные вопросы