Использовать активный объект или нет?
Как я понимаю, активный шаблон проектирования объектов связывает время жизни (частного / выделенного) потока с объектом и заставляет его работать с независимыми данными. Из некоторой документации, которую я прочитал, эволюция такого рода парадигмы была вызвана двумя причинами: во-первых, управление необработанными потоками было бы болезненным, а во-вторых, большее количество потоков, борющихся за общий ресурс, плохо масштабируется с использованием мьютекса и блокировок. хотя я согласен с первой причиной, я не полностью понимаю вторую. Активизация объекта просто делает объект независимым, но проблемы, такие как конфликт за блокировку / мьютекс, все еще существуют (так как у нас все еще есть общая очередь / буфер), объект просто делегировал ответственность за совместное использование этой очереди сообщений. Единственным преимуществом этого шаблона проектирования, как я вижу, является случай, когда мне приходилось выполнять длинную асинхронную задачу для общего объекта (теперь, когда я просто передаю сообщение в общую очередь, потокам больше не нужно долго блокировать в mutex/ блокировки, но они все равно будут блокировать и бороться за публикацию сообщений / задач). Помимо этого случая кто-то может рассказать больше сценариев, где этот тип шаблона проектирования будет иметь другие преимущества.
Второй вопрос, который у меня есть (я только начал копаться в шаблонах проектирования), какова концептуальная разница между шаблоном проектирования активного объекта, реактора и реактора. Как вы решаете, какой шаблон проектирования более эффективен и больше соответствует вашим требованиям. Было бы очень хорошо, если бы кто-то смог продемонстрировать определенные примеры, показывающие, как будут вести себя три шаблона проектирования, и какой из них имеет сравнительные преимущества / недостатки в различных сценариях.
Я немного сбит с толку, так как я использовал активный объект (который использовал общий потокобезопасный буфер) и boost::asio(Proactor) для выполнения подобных асинхронных операций, я хотел бы знать, если у кого-то есть больше идей о применимости различных моделей при приближении к проблеме.
1 ответ
На сайте ACE есть несколько очень хороших статей по шаблонам проектирования Active Object, Proactor en Reactor. Краткое резюме их намерений:
Шаблон проектирования Active Object отделяет выполнение метода от вызова метода для повышения параллелизма и упрощения синхронизированного доступа к объекту, который находится в его собственном потоке управления. Также известен как: Concurrent Object, Actor.
Шаблон Proactor поддерживает демультиплексирование и диспетчеризацию нескольких обработчиков событий, которые запускаются при завершении асинхронных событий. Этот шаблон интенсивно используется в Boost.Asio.
Шаблон проектирования Reactor обрабатывает запросы на обслуживание, которые одновременно доставляются приложению одним или несколькими клиентами. Каждая служба в приложении может состоять из нескольких методов и представлена отдельным обработчиком событий, который отвечает за отправку специфичных для службы запросов. Также известен как: Диспетчер, Уведомитель.