我想知道以下代码是否安全,因为信号可能由不同的线程触发:
using IntSignal = boost::signals2::signal<void(int)>;
class Foo
{
public:
Foo(IntSignal& signal)
: some_resource(new int(0))
{
scoped_connection = signal.connect([this](int i) { some_action(i); });
}
~Foo()
{
delete some_resource;
}
private:
void some_action(int i)
{
*some_resource = i;
}
int* some_resource;
boost::signals2::scoped_connection scoped_connection;
}
编辑:添加了一个虚构的资源、析构函数和一个实现,some_action
以使其更清晰。带着这个问题,我想澄清一下我的假设是否正确,即信号槽可能在 ' 析构函数之后Foo
但在scoped_connection
' 析构函数之前调用。为简洁起见,我省略了互斥锁保护some_resource
,但是,它与问题无关。
虽然当实例被销毁时连接会被断开,但在自己的析构函数调用和's 成员的销毁Foo
之间可能存在微小的差距。如果资源在被破坏后被使用,这可能会更成问题。Foo
Foo
some_action
我应该使用普通连接并在Foo
's 的析构函数中断开它们吗?将scoped_connection
成员作为类的最后一个成员(应该首先被销毁)并省略任何销毁逻辑是否安全?