Использование компонента, не являющегося потокобезопасным, с многопоточным компонентом (Дизайн)

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

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

Пример :

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

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

Мое решение:

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

Мой вопрос :

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


person wj.    schedule 23.12.2009    source источник


Ответы (4)


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

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

person Reed Copsey    schedule 23.12.2009

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

person jldupont    schedule 23.12.2009

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

person nos    schedule 23.12.2009

В зависимости от того, что делает Component2 не потокобезопасным...

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

person KLE    schedule 23.12.2009