最大线程数

时间:2010-10-02 06:18:43

标签: c pthreads segmentation-fault

我有一个程序可以接受2个N个数字,并使用线程&打印输出。

此处创建的主题数为2 * N - 1

每当我运行N > 151程序时,程序都会给我一个分段错误。

进程可以从线程池获取的最大线程数是否有上限?

如果是这样,这可能是造成错误的正当理由吗?

修改

Valgrind发现N <= 150没有内存泄漏。

我在Linux 2.6.x内核中运行该程序。

6 个答案:

答案 0 :(得分:10)

默认情况下,每个线程获得8MB堆栈。对于线程堆栈,300线程(8MB)仅为2.4GB - 如果您在32位模式下运行,那么这可能是您允许的进程地址空间的大部分。

在创建线程堆栈之前,可以使用pthread_attr_setstacksize()将线程堆栈的大小减少到更合理的位置:

int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize)

(创建一个新的pthread_attr,设置堆栈大小,然后将其传递给pthread_create

答案 1 :(得分:2)

POSIX保证你有64个线程。不仅仅是实施的礼物。

答案 2 :(得分:1)

这将超过300个线程!考虑处理器之间不断切换的大量开销,并优先考虑它们,以及来自其他应用程序的线程。我认为使用这样的线程是一场等待发生的灾难,也可能对你的表现没有帮助。

我怀疑它们是最大线程数,考虑到管理它们是CPU的工作。我不会使用超过100个线程,这是一个非常糟糕的主意。

答案 3 :(得分:1)

如果在Linux下:检查PTHREAD_THREADS_MAX中的limits.h。那是最大的。每个进程允许的线程数。 而且:这不应该是一个seg-fault的原因。

答案 4 :(得分:1)

您的问题没有指定操作环境,这是必须能够回答您的第一个问题,但是如果您受CPU限制并且您拥有的线程数超过处理器核心数(2或4)在大多数笔记本电脑上),那么你可能会浪费资源。

对于第二个问题,不,这不是分段错误的正当理由。假设您创建了这个荒谬的线程数量,原因是我们不知道,请仔细检查您的信号量使用情况和资源分配结果。

答案 5 :(得分:1)

我的Ubuntu框显示了123858的限制,所以我怀疑你是否遇到300,但是你的pthread_create会返回非零值。确保检查返回值。

使用-g进行编译并使用gdb运行以调试分段错误,而不是猜测原因。它会指向确切的行并告诉您导致崩溃的确切变量值。

我还建议可能出现同步问题,例如缺少互斥锁,但如果这是原因,您很可能会看到N值较小的问题,尽管不是那么频繁。