On Sun, Oct 20, 2013 at 3:37 AM, ustulation <[hidden email]> wrote:
class A
{
/* has signals2::signal(s) for callbacks, fired when completion-handler of
various async operations are invoked (eg., async_read_until etc) */
};
class B
{
void registerListenersWith_A()
{
/* has member-function listeners submitted to signals of class A eg., auto
self = shared_from_this();
shared_ptr_A->someSig_A.connect([self]{self->mem_func_B();}); */
}
void disconnectListenersWith_A()
{
/* disconnect all boost::signals2::connection(s) made above */
}
};
auto shared_ptr_A = std::make_shared< A >();
{
auto shared_ptr_B = std::make_shared< B >();
give shared_ptr_B a copy of shared_ptr_A for use above.
shared_ptr_B->registerListenersWith_A();
//....some operations here.....
shared_ptr_B->disconnectListenersWith_A();
} //i want pointer managed by shared_ptr_B to be destroyed here in a
thread-safe manner (ie., no pending calls remain from A to B etc.I'd think about using weak_ptr to break your cyclic shared_ptr object ownership between class A and B. Also, you can use the track() method on slots to auto-disconnect the member function of class B when it's last owning shared_ptr expires, rather than binding a shared_ptr into the slot. track() will also prevent the class B object from being destroyed mid-invocation by creating a temporary shared_ptr.That said, as long as you manually call disconnect at some point, the disconnected slots in the signal will eventually be destroyed during cleanup, either in a later signal::connect call, a later signal invocation, or on signal destruction.
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
http://boost.2283326.n4.nabble.com/Mixing-signals2-and-asio-mechanism-failing-tp4653392p4653403.htmlIf you reply to this email, your message will be added to the discussion below: