我使用红帽企业Linux 5.3的boost :: signals2。

我的信号创建一个对象副本,并发送它的指针到订户。这是线程安全实施,以防止工作线程从它被读取相同的时间(也许我应该重新审视锁的使用?)更新对象的字符串属性。

不管怎样,我关心的是多个用户是取消引用指针所复制的对象上自己的线程。如何控制对象的生命周期?我怎么能知道所有用户都这个对象,可以安全删除的对象?

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 !!!
}

预先感谢任何提示或方向,

-Ed

有帮助吗?

解决方案

如果你真的有通过指针传递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的照顾生命周期管理的,但也不能免除你的责任,使并发读取/从共享参数对象写入/线程安全的。你可能想传递的拷贝到你的用户单独线程安全的原因。在你的问题,这还不够清楚,我发生的事情线程明智的,所以我不能给你更具体的建议。

时的线程调用raiseParameterChangedSignal()与您的GUI线程?某些GUI工具包不允许多个线程的并发使用他们的API的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top