提高信号 - 对象的控制寿命如何发送到订阅者?智能指针?
-
19-09-2019 - |
题
我使用红帽企业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的。
不隶属于 StackOverflow