每个进程的最大线程数 - sysconf(_SC_THREAD_THREADS_MAX)失败

时间:2012-03-05 19:26:10

标签: c multithreading pthreads posix

我正在尝试在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!有谁知道如何解决这个问题,最终每个进程的最大Pthread数量是多少? 谢谢

P.S。我在Solaris和Linux上尝试过它并得到了相同的结果。但HPUX确实返回8000!

2 个答案:

答案 0 :(得分:2)

根据我在Mac OSX 10.7.X上的sysconf手册:

  

如果对sysconf()的调用不成功,则返回-1并正确设置errno。否则,如果变量与不受支持的功能相关联,则返回-1并且不修改errno。否则,返回当前变量值。

在linux下它是不同的:

  

如果name无效,则返回-1,并将errno设置为EINVAL。否则,返回的值是系统资源的值,并且不会更改errno。对于选项,如果查询选项可用,则返回正值;如果不可用,则返回-1。在限制的情况下,-1表示没有明确的限制。

所以看起来_SC_THREAD_THREADS_MAX不是该架构上的有效sysconfig变量,也可能没有限制。或许在其他架构上有-1的另一个定义。您必须查看您尝试开始工作的每个架构的手册。

如果_SC_THREAD_THREADS_MAX无效,那么您可能想要尝试进程而不是线程。也许最大进程设置也意味着最大线程。

答案 1 :(得分:2)

如果没有线程限制,则该函数返回-1。

  

POSIX标准将PTHREAD_THREAD_MAX称为系统对进程中线程总数的限制。在RHEL4和SLES9上,此宏实际上是为LinuxThreads定义的。从SLES 10开始,不再支持LinuxThreads。 Linux上的pthread的新实现,Native POSIX线程库(NPTL),除了实际的资源可用性之外,对可以创建的线程数没有限制。因此,SLES 10系统头文件中不再定义PTHREAD_THREAD_MAX宏。

info +info