2011-09-25 112 views
1

我正在设计一个客户端和服务器套接字程序。 我有一个文件从客户端使用UDP传输到服务器,我重复使用UDP ..... 我通过UDP发送所以,发送速度太快,然后接收器,所以我创建3个线程在同一套接字上侦听,因此当一个线程正在接收数据时正在做一些工作(我的意思是使用fwrite写入一个文件),另一个线程可以从客户端接收数据。多线程与锁vs单线程?

我的第一个问题是当我使用多线程的fwrite我必须使用锁作为文件指针在线程之间共享。我正确地认为?

我的第二个问题是“如果我使用多个线程来使用锁来使用单个线程执行fwrite工作而不使用锁定,那么性能会有任何改进...... ???”指导我...

回答

1

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

2

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

这样做的方式需要锁定套接字。第一季度:是的,你需要锁定它(非常慢!)。为什么不在每个线程中使用单独的文件描述符?问题主要与当前文件位置由该描述符管理。 Q2:也没有。如果数据需要排序(是的,UDP!),你仍应该缓冲它。 RAM比磁盘IO快得多。提供一个流来缓冲它,并在一个单独的线程中处理该流中的数据。

+0

我不认为我阻止了套接字....因为我在接收后做了fwrite,并且一旦我从套接字中获得了数据,就离开套接字......所以,您怎么看我阻止了套接字? – Invictus

+0

数据收到的顺序不重要吗?如果它不知道该如何写入该文件?给我更多关于实际需求的信息可能会有所帮助,但是我仍然建议缓存 - 如果没有其他的话,它可以更好地控制并行性。 – long404

1

我的第一个问题是,当我使用多线程我有作为文件指针的线程之间共享使用锁一FWRITE

是的,你总是有当多个线程使用锁正在写入一个单一的对象(文件,内存等)。

我的第二个问题是:“是否会有,如果我使用多线程使用锁在使用单线程做fwrite的工作,没有锁使用fwrite性能的任何改善... ???”

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

1

首先,尽量避免使用UDP进行批量传输。如果您使用UDP,则必须重新创建自己的流量控制协议,以及重新传输和重新排序的逻辑。从它的声音,你的问题归结为缺少流量控制 - 为什么不使用TCP?

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