C Linux 多线程网络



我在网关上有一个网络应用程序。它接收和发送数据包。对于大多数人来说,我的网关充当路由器,但在某些情况下,它也可以接收数据包。

我应该有:

  • 只有一个主线程
  • 一个主线程 + 一个分派线程,负责将其提供给正确的流处理程序
  • 有多少
  • 线程,有多少个流
  • 别的。

正确执行多线程处理并非易事,在许多情况下,基于选择和基于朋友的解决方案将更容易创建。

你的案例听起来很像一个典型的Unix服务守护进程。解决问题的流行方法不是使用线程,而是使用分叉。

这个想法是你的程序侦听套接字并等待连接。一旦连接到达,它就会分叉。然后,子进程继续处理连接。父进程本身只是在循环中继续并等待传入的连接。

与线程相比的优势:

  • 非常简单的程序设计
  • 并发没有问题
  • Unix/Linux 系统的既定方法

弊:

  • 当多个连接相互交互时,事情会变得复杂(您的用例听起来不像它们会)
  • 在 Windows 系统上的性能损失(不是在 Unix 系统上!)

您可以在线找到许多代码示例。

我对网络应用程序了解不多,但我认为它是这样的:

  • 如果您能够对请求做出异步反应,则可能只使用一个线程(如在 Node.JS 中)。如果您无法异步反应,主线程将始终阻止其他操作。
  • 如果您无法对请求做出异步反应,则必须使用多个线程。但是您可以通过许多不同的方式实现这一点:您可以为每个请求创建一个线程或有限数量的线程,然后将它们分配给您的请求。

我个人的偏好是每个连接使用一个主线程和一个工作线程。没有任何上限。我假设您的服务器将像HTTP服务器一样无状态。

对于有状态服务器,您必须找出某种方法来控制线程数。

最新更新