2009-02-18 4 views
3

Я хотел бы реализовать простой Publish/Subscribe шаблон, где:Publish/Subscribe и смарт-указатель

Один издатель издает маркер (указатель на объект) для своих абонентов. Издатель и подписчики - все независимые потоки. Я планирую добавить потокобезопасную очередь каждому подписчику, чтобы издатель мог продолжать раздавать токены подписчикам, пока они обрабатывают токены.

Как вы можете видеть, это означает, что все подписчики фактически используют одни и те же указатели (обратите внимание: абоненты не могут изменять заостренный объект в любом случае, поэтому проблем нет). Как только общий указатель больше не будет использоваться ни одним из абонентов, было бы очень приятно, если бы указатель мог автоматически удалять себя, как только последний поток подписчика будет выполнен с ним.

Это хорошее место для использования умного указателя? Если да, то какие из умных указателей я должен использовать?

Я разрабатываю Windows с MSVC2008 и использую Intel TBB, Boost и Qt.

ответ

4

Если я предполагаю, что ваш дизайн жизнеспособен (он пахнет смешным нулевым контекстом, но вполне может быть правильным), boost :: shared_ptr может быть путем.

http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/smart_ptr.htm

Edit: перейти :: shared_ptr из :: weak_ptr, потому что я идиот ...

+0

boost :: weak_ptr не будет работать для его сценария, если издатель не гарантирует сохранение объекта до тех пор, пока с ним не будет последним подписчиком. это невозможно в очереди асинхронных вызовов. –

+0

@Franci Penov: +1 за ваш ответ и этот комментарий. Ссылка, чтобы повысить документацию smart_ptr, - это единственное, что мешает мне избежать этого, поскольку это не полезно. – mghie

+0

ах, это так. Я был соблазнен идеей улучшения безопасности потоков и полностью забыл об этом «на самом деле не имея ссылки»! – metao

4

То, что вы описываете классический образец COM для жизни объекта управления. Вам нужен умный указатель, который держит контрольный счетчик на объекте - boost::shared_ptr, boost::intrusive_ptr или класс AT12 CComPtr. Я бы предложил shared_ptr, так как другие два потребуют вашей собственной реализации подсчета ref.