Boost logo

Boost Users :

Subject: [Boost-users] Mixing signals2 and asio mechanism failing
From: ustulation (ustulation_at_[hidden])
Date: 2013-10-19 17:46:50

I've the following:

<1> a single instance of io_service object with a program life-time and
several threads calling it's run() method. io_service::work is given to it
so that it never terminates (unless we stop it).

<2> class A which has boost::signals2::signal connecting functions for
callback. * async operations (eg., async_read_until, async_write etc)

<3> class B which is derived from std::shared_from_this ; * has a
composition of class A as std::unique_ptr which is instantiated in B's
constructor ; <c> has functions/listeners which are registered with signals
of class A (eg.,
signals2::connection connectionObj =

<4> Another thread outside the thread-pool of <1> above which instantiates
(and manages) class B:
auto ptrB = std::make_shared(); //and further operations.

The problem is when I need to destroy ptrB I can't. For instance, i call
some method of class B on ptrB to clear all connections it has with class A
and allow ptrB to go out of scope, but class B destructor is never called:

{//local scope
auto ptrB = std::make_shared();
/* eg auto self = shared_from_this(); connectionObj =
uniqPtrA->someSig.connect([=]{self ->listenerFuncOfB();}); referring to <3>
above */
//... do some operations
ptrB->disconnectListenersWithA(); //eg connectionObj.disconnect(); referring
to <3> above
}//Scope ends I want ptrB to destroy the underlying pointer.

The ptrB destructor is never called because signals2::connection::disconnect
does not seem to wipe out the given slot so the shared_ptr reference of B
remains with the signal in class A as anonymous functor (due to lambda in
<3> above) containing it does not get destroyed.

How do I achieve this?

View this message in context:
Sent from the Boost - Users mailing list archive at

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at