我编写了一个简单的程序来计算进程在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;
}
Run Code Online (Sandbox Code Playgroud)
我发现线程的最大数量只有300!如果我还需要更多,该怎么办?我必须提到pthread_create返回12作为错误代码.
谢谢你
Mik*_*nen 17
Linux有一个线程限制,可以通过编写所需的限制来修改运行时/proc/sys/kernel/threads-max.默认值从可用系统内存计算.除了这个限制之外,还有另一个限制:/proc/sys/vm/max_map_count它限制了最大mmapped段,并且至少最近的内核将为每个线程mmap内存.如果你点击它会增加这个限制应该是安全的.
您遇到的限制是 32位操作系统中缺少虚拟内存.如果你的硬件支持它,安装64位Linux,你会没事的.我可以轻松启动30000个堆栈大小为8MB的线程.该系统有一个Core 2 Duo + 8 GB的系统内存(我在同一时间使用5 GB用于其他内容)并且它运行64位Ubuntu和内核2.6.32.请注意,必须允许内存过量使用(/ proc/sys/vm/overcommit_memory),否则系统将需要至少240 GB的可提交内存(实际内存和交换空间的总和).
如果您需要大量线程且无法使用64位系统,则唯一的选择是最小化每个线程的内存使用量以节省虚拟内存.首先请求尽可能少的堆栈.
| 归档时间: |
|
| 查看次数: |
45070 次 |
| 最近记录: |