В течении последних нескольких лет мне доводилось применять SObjectizer не так часто, как хотелось бы. Ибо если я не писал новый код для RESTinio и самого SObjectizer-а, то в виде халтур занимался приведением в чувства чужого кода. Иногда более-менее нормального, но чаще далеко не нормального. В любом случае там не было не то, что SObjectizer-а, но даже и какого-то намека на стройный механизм обмена сообщениями. Голая многопоточность во всей красе: треды, мутексы и весь сопутствующий фарш.
Так вот, постепенно пришел к выводу, что помимо прочего в SObjectizer гораздо лучше видно сколько и каких рабочих потоков (тредов) создается, где и когда это происходит.
В SObjectizer ты имеешь дело с агентами. Агенты сами никаких нитей (тредов) не запускают. Такими вещами занимаются диспетчеры.
А места создания новых диспетчеров и привязки агентов к диспетчерам в коде хорошо видны. Так что читая код практически сразу видишь, когда новая рабочая нить запускается.
Тогда как изучая код, использующий голую многопоточность, приходится обращать внимание на то, где появляются экземпляры std::thread (или какие-нибудь самодельные обертки над POSIX Threads). Зачастую такие экземпляры являются членами какого-то класса. Типа service_manager или session_listener. И стартуют/останавливаются рабочие нити в каких-то методах этих самых service_manager/session_listener/им-подобных-классов. Что не так-то и просто обнаружить. А обнаружив потом еще и держать в памяти: "О, вот этот объект запустил рабочую нить, а затем этот объект переходит в подчинение вот этому, а нить останавливается тогда, когда..."
В общем, привыкаешь к хорошему (это я про SObjectizer), расслабляешься, теряешь нюх на неприятности... :(