gpt4 book ai didi

boost 信号 - 如何控制发送给订阅者的对象的生命周期?智能指针?

转载 作者:行者123 更新时间:2023-12-02 02:35:27 25 4
gpt4 key购买 nike

我在 Red Hat Enterprise 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 !!!
}

提前感谢任何提示或指导,

-埃德

最佳答案

如果你真的必须通过指向订阅者的指针传递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;
}

发送给您的订阅者的共享参数对象将在其引用计数变为零时自动删除(即它超出所有处理程序的范围)。

Parameter 真的如此重量级,以至于您需要通过指针将其发送给您的订阅者吗?

编辑:

请注意,使用 shared_ptr 负责生命周期管理,但不会免除您对共享参数对象线程安全进行并发读/写的责任。出于线程安全的原因,您可能很想将副本传递给您的订阅者。在你的问题中,我不太清楚线程方面发生了什么,所以我不能给你更具体的建议。

调用 raiseParameterChangedSignal() 的线程是否与您的 GUI 线程相同?一些 GUI 工具包不允许多个线程同时使用它们的 API。

关于 boost 信号 - 如何控制发送给订阅者的对象的生命周期?智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com