【问题标题】:Maximum number of threads per process - sysconf(_SC_THREAD_THREADS_MAX) failing每个进程的最大线程数 - sysconf(_SC_THREAD_THREADS_MAX) 失败
【发布时间】:2012-03-05 19:26:09
【问题描述】:

我正在尝试查找 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 数是多少? 谢谢

附:我在 Solaris 和 Linux 上进行了尝试,得到了相同的结果。但是 HPUX 确实返回了 8000!

【问题讨论】:

    标签: c multithreading pthreads posix


    【解决方案1】:

    根据我在 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 无效,那么您可能想尝试进程而不是线程。也许有一个最大进程设置,这也意味着最大线程数。

    【讨论】:

    • 其实我也确实在我的 mac os x 10.6 上尝试过这个。我确实看到没有像 PTHREAD_THREAD_MAX 这样的宏,但是 _SC_THREAD_THREADS_MAX 是在 unistd.h 中定义的。此外,内核可以处理的线程+进程的总数是否应该有硬性限制?感谢您的回复
    • 我只是想告诉你,在不知道你使用的是哪个操作系统的情况下,你会得到 -1 的原因有几个。感谢您的接受。
    • 应该有硬限制吗?听起来像是一个依赖于操作系统的答案。我认为会有,但我之前对现代操作系统的动态性感到惊讶。
    • 再评论@Reza。仅仅因为它列在unistd.h 文件中并不意味着本地操作系统支持它。某些设置可能是为可移植性定义的标准,但本地内核变体不支持。
    【解决方案2】:

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

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

    info +info

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2014-01-19
      • 2017-04-04
      • 2012-08-20
      相关资源
      最近更新 更多