Использование не поточно-ориентированного компонента с многопоточным компонентом (Дизайн) - PullRequest
3 голосов
/ 23 декабря 2009

Проблема дизайна:

Использование не поточно-ориентированного компонента (Collection, API, ...) в / с многопоточным компонентом ...

Пример:

component1 : многопоточный сервер сокетов , который отправляет сообщения ... обработчику сообщений

component2 : не поточно-безопасный обработчик сообщений , который обрабатывает сообщения ... с сервера

Мое решение:

При добавлении потокобезопасного компонента ( буфер ) между сервером и обработчиком сообщений буфер будет получать сообщения с сервера многопоточным способом и отправлять их в тот же порядок для обработчика сообщений однопоточным способом.

Мой вопрос:

Есть ли лучшее решение? подходящий шаблон проектирования может быть прокси или конвейер ?

Ответы [ 4 ]

5 голосов
/ 23 декабря 2009

Один очень хороший вариант для этого - использовать шаблон Производитель / Потребитель .

В этом случае многопоточные сокеты могут выступать в качестве защищенного буфера в качестве нескольких производителей, а ваш не поточно-безопасный обработчик сообщений может получать сообщения в своем собственном потоке совершенно синхронно. Это обеспечивает очень простой способ обработки сценариев такого типа.

3 голосов
/ 23 декабря 2009

Один из распространенных подходов состоит в том, чтобы просто защитить API, не поддерживающий потоки, с крупнозернистыми блокировками или создать тонкую оболочку, которая позаботится о блокировке

3 голосов
/ 23 декабря 2009

Мне лично нравится подход "очередь сообщений": он работает надежно, обладает хорошими характеристиками разделения и прост в реализации.

1 голос
/ 23 декабря 2009

В зависимости от , что делает Component2 не поточно-ориентированным ...

Создание экземпляров вашего компонента2 по мере необходимости:
Каждый экземпляр доступен только одному потоку, поэтому ваша система может вести себя корректно в целом. Вы можете проанализировать, если все в порядке ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...