Эффективная реализация многопоточного сервера в Qt - PullRequest
2 голосов
/ 28 декабря 2010

Я планирую многопоточный сервер, написанный на Qt.Каждое соединение будет присутствовать в отдельной теме.Каждый из этих потоков запускает свой собственный цикл обработки событий и использует асинхронные сокеты.Я хотел бы отправить константное значение (например, QString, содержащее строку события) из основного потока во все потоки клиента наиболее эффективным способом.Очевидно, что это значение должно быть удалено, когда все клиентские потоки его прочтут.

Если я просто передам данные в очереди сигнал / слот, это приведет к значительным издержкам?Будет ли эффективнее передать QSharedPointer ?Как насчет передачи const QString * вместе с QAtomicInt * для подсчета ссылок и позволить потоку уменьшить его и удалить, когда счетчик ссылок достигнет 0?

Ответы [ 2 ]

4 голосов
/ 28 декабря 2010

Несколько не по теме, но имейте в виду, что модель «один поток на соединение» может позволить любому, кто сможет подключиться, провести высокоэффективную атаку типа «отказ в обслуживании» на систему, на которой работает сервер, поскольку максимальное количество потоковэто может быть создано в любой системе ограничено.Кроме того, если он 32-разрядный, вы также можете голодать адресным пространством, поскольку каждый поток получает свой собственный стек.Размер стека по умолчанию зависит от системы.На Win32 это 1 МБ, IIRC, так что 2048 подключений, оставшихся открытыми и работающими, будут использовать 2 ГБ, то есть все адресное пространство, зарезервированное для пространства пользователя (вы можете увеличить его до 3 ГБ, но это не сильно поможет).1002 * Для получения более подробной информации, проверьте Проблема C10K , в частности Стратегии ввода / вывода -> Обслуживание одного клиента с каждым потоком сервера глава.

2 голосов
/ 05 января 2011

Согласно документации :

За кулисами QString использует неявное совместное использование (копирование при записи), чтобы сократить использование памяти и избежать ненужного копирования данных..

Исходя из этого, у вас не должно быть больше накладных расходов на отправку копий строк через соединения сигнал / слот в очереди, чем при использовании других предложенных вами решений.Поэтому я не буду беспокоиться об этом до тех пор, пока это не станет проблемой с очевидной производительностью.

...