带锁的多线程vs单线程
Multiple threads with locks vs single threads?
我正在设计一个客户端和服务器套接字程序。我有一个文件要从客户端使用UDP传输到服务器,我重复我使用UDP.....我通过UDP发送,发送速率太快,然后接收器,所以我已经创建了3个线程监听相同的套接字,所以当一个线程正在做一些工作(我的意思是写一个文件使用fwrite)与接收到的数据,另一个线程可以从客户端接收。
我的第一个问题是,当我使用多线程的fwrite时,我必须使用锁作为文件指针在线程之间共享。我的想法是对的?
我的第二个问题是"如果我使用多个线程使用锁进行fwrite,而不是使用单个线程在没有锁的情况下进行fwrite工作,性能会有任何提高吗??"…
我将使用一个线程。避免了并发症。您可以缓冲数据并使用异步写
http://www.gnu.org/s/hello/manual/libc/Asynchronous-Reads_002fWrites.html写入前缓存数据。让写作在另一个线程中进行。
这样做将需要锁定套接字。
Q1:是的,你确实需要锁定它(非常慢!)为什么不在每个线程中使用单独的文件描述符?这个问题主要是由该描述符管理的当前文件位置引起的。
Q2:没有。如果数据需要排序(是的,UDP!),您仍然应该缓冲它。RAM比磁盘IO快得多。提供一个流来缓冲它,并在单独的线程中处理该流中的数据。
与Ed的回答类似,我建议您的服务器使用异步I/O和单线程。虽然我发现使用Boost。
我的第一个问题是当我使用多个线程的fwrite时,我必须使用锁作为文件指针在线程之间共享
是的,当多个线程写入单个对象(文件,内存等)时,您总是必须使用锁。
我的第二个问题是"如果我使用多个线程使用锁进行fwrite,而不是使用单个线程在没有锁的情况下进行fwrite工作,性能会有任何提高吗??"
我会使用两个线程。第一个线程只从套接字读取数据并将数据存储在内存中。第二个线程从内存中读取数据并将其写入文件。将内存缓冲区视为FIFO队列,并使用互斥锁来保护队列指针。从第三条线程中您将一无所获。事实上,它可能会损害性能,而且肯定会使问题更加复杂。
首先,尽量避免使用UDP进行批量传输。如果你使用UDP,你必须重新设计你自己的流量控制协议,以及重传和重新排序的逻辑。听起来,您的问题归结为缺少流量控制——那么为什么不直接使用TCP呢?
无论如何,不要把文件写入到另一个线程中。现代的操作系统在任何情况下都会在内部缓冲磁盘写操作——只有当你写数据的速度远远超过磁盘的速度时,你才会开始阻塞,在这种情况下,进程内部的缓冲最多只能为你多争取几秒钟的时间。切换到TCP,或者实现适当的流量控制机制- 在C/C++中执行"_dl_init"(程序初始化)是单线程的吗
- 特定对象文件的单线程生成
- 如何在类中同时运行某些内容(在单线程平台中)?
- GDB 8.1 无法在单线程简单程序中跟踪 std::string 变量的值
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- OpenMP:共享同一算法的单线程和多线程实现
- std::原子布尔值或普通全局布尔值在单线程中很好吗?
- 重写多线程事件驱动的C 程序以使用单线程Boost :: Asio
- C++多线程操作比单线程慢
- 多线程和单线程代码维护
- 线程池的计时测试:单线程 vs 回调 tp vs 未来 tp
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- C++多线程性能比单线程代码慢
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 从单线程到多线程图像处理
- 当发送多个同时请求时,单线程异步系统中Beast Boost异步HTTP客户端的行为
- 在单线程中使用 asio::async_write 时获得"the requested resource is in use"
- 在C++中,如何在并发读取和锁定的单线程写入uncodered_map之间进行交替
- wxWidgets-单线程多任务处理
- 带锁的多线程vs单线程