Максимальное количество потоков в одном процессе - сбой sysconf (_SC_THREAD_THREADS_MAX) - PullRequest
2 голосов
/ 05 марта 2012

Я пытаюсь найти максимальное количество потоков на процесс на машине UNIX и написал следующий код для использования sysconf:

#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main() {
errno = 0;
long maxThreads = sysconf(_SC_THREAD_THREADS_MAX);
if (maxThreads == -1 && errno == 0)
{
    printf("the variable corresponding to _SC_THREAD_THREADS_MAX "
            "is associated with functionality that is not "
            "supported by the system\n");
    exit(1);
}
if (maxThreads == -1)
{
    printf("errno: %d\n", errno);
    exit(1);
}

printf ("max num threads per process: %ld\n", maxThreads);

exit(0);
}

К сожалению, sysconf () возвращает -1 без изменения значения errno! Кто-нибудь знает, как обойти эту проблему и, в конечном итоге, каково максимальное количество Pthreads на процесс? Спасибо

P.S. Я попробовал это на Solaris и Linux и получил тот же результат. Однако HPUX вернул 8000!

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Если нет ограничения потоков, функция возвращает -1.

Стандарт POSIX ссылается на PTHREAD_THREAD_MAX как системное ограничение на общее количество потоков в процессе.В RHEL4 и SLES9 этот макрос фактически определен для LinuxThreads.Начиная с SLES 10, LinuxThreads больше не поддерживается.Новая реализация pthread в Linux, Native POSIX Thread Library (NPTL), не имеет ограничения на число потоков, которые могут быть созданы, за исключением фактической доступности ресурсов.Поэтому макрос PTHREAD_THREAD_MAX больше не определяется в файлах системных заголовков SLES 10.

info + info

2 голосов
/ 05 марта 2012

Согласно моему руководству для sysconf на моем Mac OSX 10.7.X:

Если вызов sysconf () не выполнен, возвращается -1 и значение errno устанавливается соответствующим образом. В противном случае, если переменная связана с функциональностью, которая не поддерживается, возвращается -1 и значение errno не изменяется. В противном случае возвращается текущее значение переменной.

Под Linux это отличается:

Если имя недопустимо, возвращается -1 и для errno устанавливается значение EINVAL. В противном случае возвращаемое значение является значением системного ресурса и значение errno не изменяется. В случае опций возвращается положительное значение, если запрашиваемая опция доступна, и -1, если ее нет. В случае ограничений -1 означает отсутствие определенного предела.

Похоже, что _SC_THREAD_THREADS_MAX не является допустимой переменной sysconfig в этой архитектуре или, возможно, нет ограничений. Или, может быть, есть другое определение для -1 на других архитектурах. Вам придется проверить руководство по каждой архитектуре, которую вы пытаетесь заставить работать.

Если _SC_THREAD_THREADS_MAX недопустимо, вы можете попробовать процессы вместо потоков. Может быть, есть настройка макс процессов, что также означает макс потоков.

...