【问题标题】:Efficient multi-threaded server implementation in QtQt 中高效的多线程服务器实现
【发布时间】:2011-01-06 03:45:08
【问题描述】:

我正在计划一个用 Qt 编写的多线程服务器。每个连接都将在一个单独的线程中处理。这些线程中的每一个都将运行自己的事件循环并使用异步套接字。我想以最有效的方式将一个 const 值(例如,一个包含事件字符串的 QString)从主线程分派到所有客户端线程。当所有客户端线程都读取该值时,显然应该删除该值。

如果我只是在排队的信号/插槽连接中传递数据,这会带来相当大的开销吗?传递 QSharedPointer 会更有效吗?将一个 const QString* 和一个 QAtomicInt* 一起传递给引用计数并让线程减少它并在引用计数器达到 0 时将其删除呢?

【问题讨论】:

    标签: multithreading qt4 performance parameter-passing


    【解决方案1】:

    有点离题,但请注意,每个连接一个线程模型可以使任何能够连接的人对运行服务器的系统进行高效的拒绝服务攻击,因为最大线程数可以在任何系统上创建的都是有限的。此外,如果它是 32 位的,您还可以饿死地址空间,因为每个线程都有自己的堆栈。默认堆栈大小因系统而异。在 Win32 上,它是 1 MB,IIRC,因此 2048 个连接保持打开和活动状态将占用 2 GB,即为用户空间保留的整个地址空间(您可以将其增加到 3 GB,但这并没有多大帮助。)

    更多详情,请查看The C10K Problem,特别是I/O Strategies -> Serve one client with each server thread 章节。

    【讨论】:

      【解决方案2】:

      根据the documentation:

      在幕后,QString 使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。

      基于此,与使用其他建议的解决方案相比,通过排队的信号/插槽连接发送字符串副本的开销不应更多。所以我不会担心它,除非它是一个可证明的性能问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多