Выбор конкретной модели потоков должен зависеть от характера проблемы, которую вы пытаетесь решить. Не обязательно существует единый «правильный» подход к разработке модели потоков для такого приложения. Однако, если мы примем следующие предположения:
- сообщения приходят часто
- сообщения независимы и не слишком сильно зависят от общих ресурсов
- желательно ответить на поступающее сообщение как можно быстрее
- вы хотите, чтобы приложение хорошо масштабировалось на архитектурах обработки (т. Е. Многоядерные / многопроцессорные системы)
- масштабируемость является ключевым требованием к дизайну (например, больше сообщений с более высокой скоростью)
- желательна устойчивость к потере потока / длительным операциям
По моему опыту, наиболее эффективной архитектурой потоков было бы использование пула потоков. Все сообщения поступают в одну очередь, несколько потоков ждут в очереди и обрабатывают сообщения по мере их поступления. Реализация пула потоков может смоделировать все три примера распределения потоков.
# 1 Один поток обрабатывает все сообщения => пул потоков только с одним потоком
# 2 Поток на N типов сообщений => пул потоков с N потоками, каждый поток просматривает очередь, чтобы найти соответствующие типы сообщений
# 3 Несколько потоков для всех сообщений => пул потоков с несколькими потоками
Преимущества этого дизайна в том, что вы можете масштабировать количество потоков в потоке пропорционально среде обработки или загрузке сообщений. Число потоков может даже масштабироваться во время выполнения, чтобы адаптироваться к получаемой в реальном времени загрузке сообщений.
Для большинства платформ доступно множество хороших библиотек пула потоков, включая .NET, C ++ / STL, Java и т. Д.
Что касается вашего второго вопроса, использовать ли стандартный механизм отправки сообщений Windows. Этот механизм имеет значительные накладные расходы и на самом деле предназначен только для прокачки сообщений через цикл пользовательского интерфейса Windows-приложения. Если это не та проблема, которую вы пытаетесь решить, я бы не советовал использовать ее в качестве общего решения для рассылки сообщений. Кроме того, сообщения Windows несут очень мало данных - это не объектно-ориентированная модель. Каждое сообщение Windows имеет код и 32-битный параметр. Этого может быть недостаточно для построения чистой модели обмена сообщениями. Наконец, очередь сообщений Windows не предназначена для обработки таких случаев, как насыщение очереди, нехватка потоков или повторная постановка сообщений в очередь; это случаи, которые часто возникают при реализации достойного решения для очереди сообщений.