【问题标题】:Is multithreading required when client and server want to talk at the same time?当客户端和服务器要同时通话时,是否需要多线程?
【发布时间】:2013-02-02 16:52:48
【问题描述】:

我有两个关于使用套接字进行客户端服务器通信的问题。假设在这两种情况下只有 1 个客户。

1) 我知道我们可以使用单个套接字在客户端和服务器之间发送和接收数据。但是在这种情况下,当服务器和客户端都试图同时发送数据时会发生什么?

2) 以下哪一个是最好的模型? i) 使用单线程、单套接字进行发送和接收 ii) 使用 2 个线程(一个用于发送,一个用于接收),单套接字 iii) 使用 2 个套接字和 2 个线程,一个用于发送,一个用于接收。

【问题讨论】:

  • 你在套接字之间使用什么协议? TCP/IP?

标签: c multithreading sockets client-server posix


【解决方案1】:

连接是全双工的,这意味着发送和接收可以同时发生。因此,在回答第一个问题时,客户端和服务器都将能够同时从其套接字发送/读取数据。

就哪种“模型”最好而言,这取决于您的应用程序以及您想要实现的目标。顺便说一句,您不需要 使用多线程。你可以:

  • 多进程(分叉)
  • 使用非阻塞套接字(选择/轮询)
  • 使用异步通知(信号)

各有利弊。

【讨论】:

    【解决方案2】:

    对于第一个问题,不会发生什么特别的事情。 TCP是全双工的,一个连接的两端可以同时发送。

    由于同时发送/接收没有问题,所以第二个问题中的第一个选择将是最简单的。

    【讨论】:

    • 谢谢。如果我使用 2 个线程和 2 个套接字,会有任何性能提升吗?
    • @linuxfreak 可能不会,很可能反过来。
    • @Joachim:对不起..我不明白这个概念。假设两台机器同时尝试通话,我使用 2 个线程和 2 个套接字时会不会更快?您能否解释一下当我使用超过 1 个线程时性能如何滞后?你能给我指一些文章来帮助我理解何时使用多线程/套接字吗?
    • @linuxfreak 当你有两个线程时,处理器必须一直在它们之间切换。即使在现代多核处理器上,切换上下文仍可能需要时间。此外,您的线程必须同步,这也会降低性能。当然还有增加的代码复杂性。实际上,许多服务器可以在单个线程中处理数百个连接,同时进行输入和输出并检查新连接。使用单线程编写一个只处理一个连接的服务器非常简单。
    • 感谢您的解释。那么,我应该什么时候去线程呢?
    【解决方案3】:

    在那种情况下,您不需要线程。套接字本身会缓冲传入的数据,直到您从文件描述符中读取它。更准确地说,从硬件开始有多个级别的缓冲区。您不会错过数据,因为您同时在写入数据,它只会等待您,直到您下一次从套接字的文件描述符中读取数据。

    【讨论】:

      【解决方案4】:

      如果你想在多个套接字上轮询,没有内在需要多线程。 您真正需要做的就是使用select()

      为了实现这一点,您定义了一个FD_SET(文件描述符集),向其中添加您想要轮询的所有套接字。这个set 交给select(),它会返回所有带有待处理数据的文件描述符。

      selectfd_setselect tutorial 的手册页

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 2021-01-07
        • 2020-12-16
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多