Ответ на вопрос:
дать каждому потомку класса "алгоритм" отдельный поток (может быть
сделайте его приватным, тогда не требуется shared_ptr)
Используйте только std::shared_ptr<>
, если право собственности действительно разделено.
Обычно нет ничего плохого в том, что бездействующие потоки зависают, но во многих системах накладные расходы даже превышают потолок для экземпляров потоков, даже если многие не работают.
Если существует риск распространения потоков или слишком большого количества создания и уничтожения потоков и подкачки, представьте пул потоков и по-прежнему не используйте shared_ptr <>, поскольку пул имеет собственные потоки.