C++ 带锁的多线程与单线程?

C++ 带锁的多线程与单线程?,c++,sockets,mutex,C++,Sockets,Mutex,我正在设计一个客户端和服务器套接字程序。 我有一个文件要使用UDP从客户端传输到服务器,我重复一下,我正在使用UDP。。。。。 我是通过UDP发送的,所以发送速度比接收方快,所以我在同一个套接字上创建了3个线程,这样当一个线程正在使用接收到的数据执行某些工作(我指的是使用fwrite写入文件)时,另一个线程可以从客户端接收 我的第一个问题是,当我对多个线程使用fwrite时,我必须使用锁,因为文件指针在线程之间共享。我的想法是对的 我的第二个问题是“如果我使用多个线程使用锁进行写操作,而不是使用

我正在设计一个客户端和服务器套接字程序。 我有一个文件要使用UDP从客户端传输到服务器,我重复一下,我正在使用UDP。。。。。 我是通过UDP发送的,所以发送速度比接收方快,所以我在同一个套接字上创建了3个线程,这样当一个线程正在使用接收到的数据执行某些工作(我指的是使用fwrite写入文件)时,另一个线程可以从客户端接收

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


我的第二个问题是“如果我使用多个线程使用锁进行写操作,而不是使用单个线程在没有锁的情况下进行写操作,那么性能是否会有任何改进…”。。。请引导我…

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

这样做需要锁定插座

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


问题2:都不是。如果数据需要排序(是的,UDP!),您仍然应该对其进行缓冲。RAM比磁盘IO快得多。将流馈送到缓冲区,并在单独的线程中处理该流中的数据。

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

这样做需要锁定插座

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

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

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

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

我的第二个问题是“如果我使用多个线程使用锁进行写操作,而不是使用单个线程在没有锁的情况下进行写操作,那么性能是否会有任何改进…”

我会用两条线。第一个线程除了从套接字读取数据并将数据存储在内存中之外什么也不做。第二个线程从内存中读取数据并将其写入文件。将内存缓冲区视为FIFO队列,并使用互斥来保护队列指针。你从第三条线索中一无所获。事实上,这可能会损害性能,而且肯定会使问题更加复杂

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

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

我的第二个问题是“如果我使用多个线程使用锁进行写操作,而不是使用单个线程在没有锁的情况下进行写操作,那么性能是否会有任何改进…”


我会用两条线。第一个线程除了从套接字读取数据并将数据存储在内存中之外什么也不做。第二个线程从内存中读取数据并将其写入文件。将内存缓冲区视为FIFO队列,并使用互斥来保护队列指针。你从第三条线索中一无所获。事实上,这可能会损害性能,而且肯定会使问题更加复杂。

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


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


与类似,我建议您的服务器使用异步I/O和单线程。虽然我发现使用posix AIO比使用posix AIO更简单。

与类似,但我建议您的服务器使用异步I/O和单线程。尽管我发现使用posix AIO比使用posix AIO更简单。

首先,尽量避免使用UDP进行批量传输。如果您使用UDP,您必须重新设计自己的流控制协议,以及用于重新传输和重新排序的逻辑。从听起来,您的问题归结为缺少流控制——那么为什么不直接使用TCP呢


无论如何,不要将文件写入另一个线程。现代操作系统在任何情况下都会在内部缓冲磁盘写入—只有在写入数据的速度远远快于磁盘的速度时,才会开始阻塞,在这种情况下,进程内的缓冲最多只会为您多买几秒钟。切换到TCP,或实施适当的流控制机制。

首先,尝试避免使用UDP进行批量传输。如果您使用UDP,您必须重新设计自己的流控制协议,以及用于重新传输和重新排序的逻辑。从听起来,您的问题归结为缺少流控制——那么为什么不直接使用TCP呢


无论如何,不要将文件写入另一个线程。现代操作系统在任何情况下都会在内部缓冲磁盘写入—只有在写入数据的速度远远快于磁盘的速度时,才会开始阻塞,在这种情况下,进程内的缓冲最多只会为您多买几秒钟。切换到TCP,或实现适当的流控制机制。

我认为我没有阻塞套接字。。。。因为,我在接收数据后正在进行写操作,一旦从中获得数据,我就会离开套接字。。。。那么,您认为我是如何阻止套接字的???接收数据的顺序不重要吗?如果没有,你怎么知道在那个文件里写什么?给我更多关于实际需求的信息可能会有所帮助,但我还是建议使用缓存——这样可以更好地控制并行性,如果没有其他的事情的话。。。。因为,我