假设对象相互调用的 OO 设计,一段时间后被调用的对象回调初始对象(调用和回调)。在正常程序终止期间,当调用析构函数时,是否有某种承诺不会调用系统计时器,也不会有对象发起回调?
问问题
1102 次
4 回答
2
不,没有这样的保证。
您需要编写代码,使对象在您使用完它们之前不会被破坏。
于 2010-11-22T06:36:31.977 回答
2
有一个非常棒的库来处理这些类型的调用,当然它是一个 Boost 库。
看哪Boost.Signals2,即使在多线程应用程序中也能保证正确性:)
特别注意boost::trackable
类的使用,以便对象销毁在调用发生之前自动使调用无效。
注意:Boost.Signals(它的祖先)具有几乎相同的功能,但不是线程安全的
于 2010-11-22T09:59:13.980 回答
1
- boost 的 weak_ptr 通常可以帮助避免从回调中访问被破坏的对象,因此也可能在终止期间。使用它时,所有需要回调的对象都需要一个 shared_ptr。
- 定时器调用函数/回调通常是高端库,因此取决于它们是否支持 stopAllTimers() 功能。如果你可以控制这个库,实现起来可能并不太难,但你仍然需要知道什么时候触发它。
于 2010-11-22T09:28:58.723 回答
1
不,没有承诺。
有两种方法可以处理这个问题:
有一个对象可以在销毁时调用的注销函数,它保证在它终止后不会调用任何回调 -
CancelAllCallbacks()
或类似的。有一个弱引用机制,例如已经提到的weak_ptr,只有在成功获得强引用时才调用回调。
通常第一个选项就足够了,除非回调可以被调度或异步调用 - 然后你没有同步的方式来阻止已经被调度调用的回调,或者实际上正在被调用(或者一些指令来自现在)在不同的线程中。
于 2010-11-22T09:57:55.970 回答