Release tracked shared_ptrs outside the lock to avoid a deadlock if boost::signals2::mutex doesn't lock recursively. Index: slot_call_iterator.hpp =================================================================== --- slot_call_iterator.hpp +++ slot_call_iterator.hpp @@ -113,8 +113,8 @@ } for(;iter != end; ++iter) { + cache->tracked_ptrs.clear(); lock_type lock(**iter); - cache->tracked_ptrs.clear(); (*iter)->nolock_grab_tracked_objects(std::back_inserter(cache->tracked_ptrs)); if((*iter)->nolock_nograb_connected()) {