C++ C++;:析构函数级联期间的回调和系统计时器事件
假设一个OO设计,其中对象相互调用,一段时间后被调用的对象回调初始对象(调用和回调)。在正常的程序终止期间,当调用析构函数时,是否有某种承诺,即不会调用系统计时器,也不会有对象启动回调?不,没有这种保证C++ C++;:析构函数级联期间的回调和系统计时器事件,c++,timer,oop,object-destruction,C++,Timer,Oop,Object Destruction,假设一个OO设计,其中对象相互调用,一段时间后被调用的对象回调初始对象(调用和回调)。在正常的程序终止期间,当调用析构函数时,是否有某种承诺,即不会调用系统计时器,也不会有对象启动回调?不,没有这种保证 您需要编写代码,以便在使用完对象之前不会销毁它们。不,没有这样的保证 您需要编写代码,使对象在使用完毕之前不会被破坏。 boost的弱_ptr通常可以帮助避免从回调中访问被破坏的对象,因此在终止期间也可能如此。使用此选项时,所有需要回调的对象都需要一个共享的\u ptr 调用函数/回调的计时器通
您需要编写代码,以便在使用完对象之前不会销毁它们。不,没有这样的保证 您需要编写代码,使对象在使用完毕之前不会被破坏。
- boost的弱_ptr通常可以帮助避免从回调中访问被破坏的对象,因此在终止期间也可能如此。使用此选项时,所有需要回调的对象都需要一个共享的\u ptr
- 调用函数/回调的计时器通常是高端库,因此这取决于它们是否支持stopAllTimers()功能。如果您可以控制库,那么实现它可能并不太困难,但您仍然需要知道何时触发它
- boost的弱_ptr通常可以帮助避免从回调中访问被破坏的对象,因此在终止期间也可能如此。使用此选项时,所有需要回调的对象都需要一个共享的\u ptr
- 调用函数/回调的计时器通常是高端库,因此这取决于它们是否支持stopAllTimers()功能。如果您可以控制库,那么实现它可能并不太困难,但您仍然需要知道何时触发它
- 具有一个对象可以在销毁时调用的注销函数,该函数保证在对象终止后不会调用回调-
或类似函数CancelAllCallbacks()
- 使用弱引用机制,如前面提到的弱ptr,仅在成功获取强引用时调用回调
- 具有一个对象可以在销毁时调用的注销函数,该函数保证在对象终止后不会调用回调-
或类似函数CancelAllCallbacks()
- 使用弱引用机制,如前面提到的弱ptr,仅在成功获取强引用时调用回调
- 不,没有承诺
有两种方法可以处理此问题:
通常,第一个选项就足够了,除非可以异步调度或调用回调-那么您就没有同步的方法来阻止已经计划调用的回调,或者实际上正在另一个线程中调用的回调(或者从现在起调用一些指令)。不,没有承诺 有两种方法可以处理此问题:
通常,第一个选项就足够了,除非可以异步调度或调用回调-那么您就没有同步的方法来阻止已经计划调用的回调,或者实际上现在正在调用的回调(或者以后的一些指令)在另一个线程中。有一个非常棒的库来处理这类调用,当然它是一个增强库 注意,即使在多线程应用程序中也能保证正确性:) 请特别注意使用了
boost::trackable
类,以便对象销毁在调用发生之前自动使其失效
注意:Boost.Signals(它的祖先)具有几乎相同的功能,但不是线程安全的有一个非常棒的库来处理这类调用,当然它是一个Boost库 注意,即使在多线程应用程序中也能保证正确性:) 请特别注意使用了
boost::trackable
类,以便对象销毁在调用发生之前自动使其失效
注意:Boost.Signals(其前身)具有几乎相同的功能,但不是线程安全的是,如果不注意正确的对象清理,所描述的场景通常会导致程序故障。是的,如果不注意正确的对象清理,所描述的场景通常会导致程序故障。