4

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

我应该有:

  • 只有一个主线程
  • 一个主线程 + 一个调度线程,负责将其提供给正确的流处理程序
  • 与流一样多的线程
  • 别的东西。

?

4

4 回答 4

2

正确地执行多线程并不是一件简单的事情,在许多情况下,基于选择朋友的解决方案将更容易创建。

于 2012-06-29T14:48:23.780 回答
2

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

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

相对于线程的优点:

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

缺点:

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

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

于 2012-06-29T14:52:38.507 回答
1

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

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

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

对于有状态的服务器,您必须想办法控制线程数。

于 2014-04-29T00:27:46.153 回答