c - 服务器多线程,协议(protocol)必须?和更多

标签 c architecture networking protocol-buffers

假设应用层协议(protocol)是通过UDP实现的。客户端需要超时,因此服务器需要保留与其通信的每个客户端的状态。

还假设使用了select

  1. 实现多线程服务器总是最好的吗?我认为链接列表也会做同样的事情,其中​​服务器超时 time=客户端的最早超时 - CurrentTime 。链接列表具有与保留客户端状态相同的功能,同时避免创建新线程的开销(尽管为服务器维护特定于客户端的超时引入了一些复杂性)。

  2. 如果选择多线程,那么接下来,为新客户端调用新套接字是最好的吗?这会引入系统资源开销。但我认为默认的服务器套接字(bind与服务器众所周知的端口)会做同样的事情,因为它有缓冲区(好吧..对于可扩展的客户端数量来说可能不够长..)

谢谢!

最佳答案

根据我的经验,当可怕的同步问题潜伏着,等待某些事件以正确的顺序发生而导致应用程序崩溃时,线程使您的代码很容易看起来合乎逻辑且干净。线程是一个非常有用的工具 - 如果您的应用程序能够充分利用您的 CPU,您需要考虑线程,并且学习使用线程是学习利用分布式处理的一个步骤(至少,我想是的)。

我的偏好是使用异步回调编写应用程序,而不是阻塞调用,并显式指示我要使用哪个线程来处理回调。这样做有以下优点:

  • 它使状态变量交互更加可控,因此可预测,这意味着线程更加稳健。
  • 如果做得正确,它可以充分利用 CPU 拥有的处理器数量。
  • 它允许您直接控制要赋予某些函数的优先级 - 如果该函数具有高优先级,则将其分派(dispatch)给高优先级线程,然后当它完成时,它会发送结果通过调用者线程中的延续返回到低优先级调用者。或者到另一个线程 - 没有理由限制它。
  • 通常可以移植到非线程环境。也许对大多数人来说并不重要,但有时对我来说很重要。

关于c - 服务器多线程,协议(protocol)必须?和更多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163490/

相关文章:

c++ - 识别服务器的别名

c - 为 getchar() 添加超时

c - 在指针数组的 qsort 实现中使用 FOR 循环但不使用 WHILE 时出现段错误

c - crypt() 在 C 中做什么?

hadoop - 每天处理 10 B 行数据以创建变量(计算列)的最佳方法是什么?

c# - 解耦架构

c - 将整数传递给子进程

Java - 单线程执行器

networking - 回合制多人物理网络

sockets - 我可以使用Winsock发送非IP数据包吗?