linux中每个进程的最大线程数

Hos*_*osi 8 linux pthreads

我编写了一个简单的程序来计算进程在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位系统,则唯一的选择是最小化每个线程的内存使用量以节省虚拟内存.首先请求尽可能少的堆栈.


Adr*_*Cox 6

您的系统限制可能不允许您映射所需的所有线程的堆栈.看看/proc/sys/vm/max_map_count,看看这个答案.我不是100%确定这是你的问题,因为大多数人在更大的线程数时遇到问题.