повышающие сигналы - Как контролировать время жизни объектов, отправляемых подписчикам?Умные подсказки?

StackOverflow https://stackoverflow.com/questions/2021349

Вопрос

Я использую boost::signals2 под Red Hat Enterprise Linux 5.3.

Мой сигнал создает копию объекта и отправляет указатель на него подписчикам.Это было реализовано в целях потокобезопасности, чтобы рабочий поток не обновлял строковое свойство объекта одновременно с его чтением (возможно, мне следует вернуться к использованию блокировок?).

В любом случае, меня беспокоит несколько подписчиков, которые разыменовывают указатель на скопированный объект в своем собственном потоке.Как я могу контролировать время жизни объекта?Как я могу узнать, что все подписчики завершили работу с объектом и удалить объект безопасно?

typedef boost::signals2::signal< void ( Parameter* ) > signalParameterChanged_t;
signalParameterChanged_t    m_signalParameterChanged;

// Worker Thread - Raises the signal
void Parameter::raiseParameterChangedSignal()
{
      Parameter* pParameterDeepCopied = new Parameter(*this);
      m_signalParameterChanged(pParameterDeepCopied);
}
// Read-Only Subscriber Thread(s) - GUI (and Event Logging thread ) handles signal
void ClientGui::onDeviceParameterChangedHandler( Parameter* pParameter)
{
      cout << pParameter->toString() << endl;
      delete pParameter;  // **** This only works for a single subscriber !!!
}

Заранее спасибо за любые советы или указания,

-Эд

Это было полезно?

Решение

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

typedef boost::shared_ptr<Parameter> SharedParameterPtr;
typedef boost::signals2::signal< void ( SharedParameterPtr ) > signalParameterChanged_t;
signalParameterChanged_t    m_signalParameterChanged;

// The signal source
void Parameter::raiseParameterChangedSignal()
{
      SharedParameterPtr pParameterDeepCopied = new Parameter(*this);
      m_signalParameterChanged(pParameterDeepCopied);
}
// The subscriber's handler
void ClientGui::onDeviceParameterChangedHandler( SharedParameterPtr pParameter)
{
      cout << pParameter->toString() << endl;
}

Объект с общим параметром, отправленный вашим подписчикам, будет автоматически удален, когда количество ссылок на него станет равным нулю (т.е.это выходит за рамки всех обработчиков).

Действительно ли параметр настолько тяжеловесен, что вам нужно отправлять его своим подписчикам через указатель?

Редактировать:

Пожалуйста, обратите внимание, что использование shared_ptr обеспечивает управление временем жизни, но не освобождает вас от ответственности за обеспечение потокобезопасности одновременных операций чтения / записи в / из объекта shared parameter.Вполне возможно, что вы захотите передать копию своим подписчикам только по соображениям потокобезопасности.В вашем вопросе мне недостаточно ясно, что происходит по потоку, поэтому я не могу дать вам более конкретных рекомендаций.

Вызывает ли поток raiseParameterChangedSignal() такой же, как ваш поток графического интерфейса?Некоторые наборы инструментов с графическим интерфейсом не позволяют одновременное использование их API несколькими потоками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top