Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux中的线程/套接字限制_C++_Linux_Multithreading_Sockets_Posix - Fatal编程技术网

C++ Linux中的线程/套接字限制

C++ Linux中的线程/套接字限制,c++,linux,multithreading,sockets,posix,C++,Linux,Multithreading,Sockets,Posix,首先:对不起我的英语。 伙计们,我在POSIX套接字和/或pthread方面遇到了问题。我正在开发嵌入式设备(ARM9CPU)。在设备上将多线程tcp服务器工作。它将能够处理大量的传入连接。服务器从客户端获取连接并增加计数器变量(无符号int计数器)。客户端例程将在单独的线程中运行。所有客户端将使用1个单例类实例(在该类中,将打开和关闭相同的文件)。客户端处理文件,然后客户端线程关闭连接套接字,并调用pthread_exit()。 因此,我的tcp服务器无法处理超过250个线程(计数器=249+

首先:对不起我的英语。 伙计们,我在POSIX套接字和/或pthread方面遇到了问题。我正在开发嵌入式设备(ARM9CPU)。在设备上将多线程tcp服务器工作。它将能够处理大量的传入连接。服务器从客户端获取连接并增加计数器变量(无符号int计数器)。客户端例程将在单独的线程中运行。所有客户端将使用1个单例类实例(在该类中,将打开和关闭相同的文件)。客户端处理文件,然后客户端线程关闭连接套接字,并调用pthread_exit()。
因此,我的tcp服务器无法处理超过250个线程(计数器=249+1(服务器线程)。我得到了“资源暂时不可用”。问题是什么?

使用ulimit-n检查文件系统句柄的数量。如果数量太少,可以为当前会话增加它


您还可以编辑/etc/security/limits.conf并设置永久限制。通常,在32位系统上遇到的第一个限制是,使用默认堆栈大小时,虚拟地址空间不足

在创建线程(小于1MB)或使用“ulimit-s”设置默认堆栈大小时,请尝试显式指定堆栈大小


还请注意,您需要pthread_detach或pthread_join您的线程,以便释放所有资源。

每当您达到线程限制时,或者如前所述,由于线程数量而耗尽虚拟进程地址空间时,您就……做错了。更多的线程无法扩展。尤其是在进行嵌入式编程时。您可以改为在线程池上处理请求。用于在较少的线程上处理许多连接。这是一个非常好的领域,库(如ACE、asio)利用此模型是有充分理由的

“每请求线程数”模型之所以流行,主要是因为它的(可感知的)简单设计

不过,只要在单个逻辑线程(有时称为串)上保持连接,就没有真正的区别

此外,如果请求的处理不涉及阻塞操作,那么您永远也不会比在单个线程上进行轮询和处理做得更好:您可以使用bind/accept的“backlog”特性让内核为您担心挂起的连接!(注意:这假设是一个单核CPU,在双核CPU上,这种处理最好是每个CPU一个线程)

编辑添加内容:


ulimit显示了操作系统可以处理多少线程,对吗?如果是,ulimit不能解决我的问题,因为我的应用程序在同一时间使用了约10-15个线程


如果是这样的话,你应该仔细检查你是否正确地连接或分离了所有线程。同时想想同步对象;如果你总是忘记调用相关的pthread*\u destroy函数,即使不需要它,你也会遇到限制。这当然会是一个资源泄漏。有些工具可能能够帮助你发现它们(我想到了vlagrind/helgrind)

检查
ulimit
看看有什么限制,我猜你可能已经达到了。我检查过了,ulimit说我可以使用900+(可能是994)个线程。顺便问一下,你是说250个并发线程(或者其中一些线程已经终止了)?好的。如果有空闲内存和cpu时间,我可以定义一些可以创建未限制线程数的地方吗?ulimit显示操作系统可以处理多少线程,对吗?如果是,ulimit不能解决我的问题,因为我的应用程序在同一时间使用10-15个线程。我的客户端线程在退出之前清除所有指针,关闭所有描述符。然后它不会占用太多内存。pthread是否在退出后清除堆栈?当线程正确终止时,此堆栈将被解除分配。您是正在分离线程(pthread_detach)还是正在加入线程(pthread_join)?别忘了,您可以在创建时使用pthread属性设置堆栈大小()@爱德华:为回应爱德华的评论添加了一条评论。谢谢。pthread_detach解决了我的问题。thanx还提供了关于线程的更多信息。它非常有用!