我有一个程序可以接受2个N
个数字,并使用线程&打印输出。
此处创建的主题数为2 * N - 1
。
每当我运行N > 151
程序时,程序都会给我一个分段错误。
进程可以从线程池获取的最大线程数是否有上限?
如果是这样,这可能是造成错误的正当理由吗?
修改
Valgrind发现N <= 150
没有内存泄漏。
我在Linux 2.6.x内核中运行该程序。
答案 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值较小的问题,尽管不是那么频繁。