我编写了一个简单的程序来计算Linux(Centos 5)中一个进程可以拥有的最大线程数。这是代码:
int main()
{
pthread_t thrd[400];
for(int i=0;i<400;i++)
{
int err=pthread_create(&thrd[i],NULL,thread,(void*)i);
if(err!=0)
cout << "thread creation failed: " << i <<" error code: " << err << endl;
}
return 0;
}
void * thread(void* i)
{
sleep(100);//make the thread still alive
return 0;
}
我发现线程的最大数量只有 300!?如果我需要更多怎么办?
我必须提到 pthread_create 返回 12 作为错误代码。
之前谢谢
有Linux 的线程限制并且可以通过将所需的限制写入来修改运行时/proc/sys/kernel/threads-max
。默认值是根据可用系统内存计算的。除了这个限制之外,还有另一个限制:/proc/sys/vm/max_map_count
这限制了最大映射段,并且至少最近的内核将为每个线程映射内存。如果您达到了该限制,那么大幅增加该限制应该是安全的。
但是,那您遇到的限制是缺乏虚拟内存在32位操作系统中。如果你的硬件支持,安装 64 位 Linux 就可以了。我可以轻松启动 30000 个线程,堆栈大小为 8MB。该系统有一个 Core 2 Duo + 8 GB 系统内存(我同时使用 5 GB 用于其他东西),并且运行内核为 2.6.32 的 64 位 Ubuntu。请注意,必须允许内存过量使用 (/proc/sys/vm/overcommit_memory),否则系统将需要至少 240 GB 的可提交内存(实际内存和交换空间的总和)。
如果您需要大量线程并且无法使用 64 位系统,您唯一的选择是最小化每个线程的内存使用量以节省虚拟内存。首先请求尽可能少的堆栈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)