我正在计划用Qt编写的多线程服务器。每个连接都将在一个单独的线程中进行。每个线程都会运行自己的事件循环并使用异步套接字。我想以最有效的方式从主线程向所有客户端线程发送一个const值(例如,包含事件字符串的QString)。当所有客户端线程都已读取它时,显然应删除该值。
如果我只是在排队的信号/插槽连接中传递数据,这是否会带来相当大的开销?传递QSharedPointer< QString&gt ;?会更有效吗?如何将const QString *与QAtomicInt *一起传递给引用计数,让线程减少它并在引用计数器达到0时删除它?
答案 0 :(得分:4)
有点偏离主题,但请注意,每个连接的单线程模型可以使任何能够连接的人对运行服务器的系统进行高效的拒绝服务攻击,因为最大线程数可以在任何系统上创建的都是有限的。此外,如果它是32位,您也可以使地址空间饿死,因为每个线程都有自己的堆栈。默认堆栈大小会改变系统。在Win32上它是1 MB,IIRC,所以2048个连接保持打开和活着将占用2 GB,即为用户空间保留的整个地址空间(你可以将其提升到3 GB,但这没有多大帮助。)
有关详情,请查看The C10K Problem,特别是I/O Strategies -> Serve one client with each server thread章节。
答案 1 :(得分:2)
在幕后,QString使用隐式共享(copy-on-write)来减少内存使用并避免不必要的数据复制。
基于此,您不应该比通过其他提议的解决方案更多地通过排队的信号/插槽连接发送字符串副本。所以我不担心它,除非它是一个可证明的性能问题。