【问题标题】:Multiple threads with locks vs single threads?带锁的多线程与单线程?
【发布时间】:2011-09-25 20:37:00
【问题描述】:

我正在设计一个客户端和服务器套接字程序。 我有一个文件要使用 UDP 从客户端传输到服务器,我再说一遍我正在使用 UDP ..... 我通过 UDP 发送,所以发送速率比接收器快,所以我创建了 3 个线程在同一个套接字上侦听,这样当一个线程正在做一些工作时(我的意思是使用 fwrite 写入文件)其他线程可以从客户端接收数据。

我的第一个问题是当我使用具有多个线程的 fwrite 时,我必须使用锁,因为文件指针在线程之间共享。我的想法是对的???

我的第二个问题是“如果我使用多个线程使用锁进行 fwrite,而不是使用单个线程在没有锁的情况下进行 fwrite 工作,性能会有什么提高......???”......请指导我……

【问题讨论】:

    标签: c++ sockets mutex


    【解决方案1】:

    我会使用一个线程。省去并发症。您可以缓冲数据并使用异步写入

    http://www.gnu.org/s/hello/manual/libc/Asynchronous-Reads_002fWrites.html

    【讨论】:

      【解决方案2】:

      在写入之前缓存数据。 让写作发生在另一个线程中。

      按照您的方式进行操作需要锁定套接字。

      Q1:是的,您确实需要锁定它(非常慢!)。为什么不在每个线程中使用单独的文件描述符?问题主要在于该描述符管理的当前文件位置。

      Q2:两者都不是。如果数据需要排序(是的,UDP!)你仍然应该缓冲它。 RAM 比磁盘 IO 快得多。提供一个流以对其进行缓冲并在单独的线程中处理该流中的数据。

      【讨论】:

      • 我不认为我正在阻塞套接字....因为,我在接收后正在执行 fwrite,一旦我从套接字中获取数据,我就会离开套接字....所以,你觉得我怎么堵住了socket???
      • 接收数据的顺序不重要吗?如果它不知道你怎么知道在那个文件中写什么?向我提供有关实际需求的更多信息可能会有所帮助,但我仍然建议使用缓存 - 如果没有别的,它可以更好地控制并行性。
      【解决方案3】:

      类似于Ed's answer,我建议为您的服务器使用异步 I/O 和单线程。虽然我发现使用 Boost.Asio 比使用 posix AIO 更容易。

      【讨论】:

        【解决方案4】:

        我的第一个问题是当我使用具有多个线程的 fwrite 时,我必须使用锁,因为文件指针在线程之间共享

        是的,当多个线程写入单个对象(文件、内存等)时,您总是必须使用锁。

        我的第二个问题是“如果我使用多个线程使用锁进行 fwrite,而不是使用单个线程在没有锁的情况下进行 fwrite 工作,性能会有什么提高......???”

        我会使用两个线程。第一个线程什么都不做,只是从套接字读取数据并将数据存储在内存中。第二个线程从内存中读取数据并将其写入文件。将内存缓冲区视为 FIFO 队列并使用互斥锁来保护队列指针。你不会从第三个线程中获得任何东西。事实上,它可能会损害性能,并且肯定会使问题变得更加复杂。

        【讨论】:

          【解决方案5】:

          首先,尽量避免使用 UDP 进行批量传输。如果您使用 UDP,您必须重新发明自己的流量控制协议,以及重新传输和重新排序的逻辑。听上去,您的问题归结为缺少流量控制 - 那么为什么不直接使用 TCP?

          无论如何,不​​要把你的文件写在另一个线程中。在任何情况下,现代操作系统都会在内部缓冲磁盘写入 - 如果您写入数据的速度比磁盘可以跟上的速度快得多,您只会开始阻塞,在这种情况下,您的进程内部的缓冲最多只会为您再买几秒钟。切换到 TCP,或实施适当的流量控制机制。

          【讨论】:

            猜你喜欢
            • 2018-06-20
            • 2017-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-23
            • 2012-07-26
            • 1970-01-01
            相关资源
            最近更新 更多