Я думаю, что у вас есть недостаток дизайна, так как вы используете shared_ptr для потока без гарантии владения Derived.
Как указано snake_style, вы должны присоединиться к вашему потоку.
I'mЯ буду утверждать, что вы должны хранить поток по значению в вашем классе, чтобы гарантировать время жизни Derived:
#include <thread>
#include <memory>
class Derived {
public:
Derived() {
mThread = std::thread(&Derived::callback, this);
}
~Derived() {
if (mThread.joinable())
mThread.join();
}
void callback() {}
int add(int x, int y) { return x + y; }
private:
std::thread mThread;
};
Оператор if в Dtor защищает вас от неправильного поведения при перемещении Derived.
Другой способ гарантировать владение - поместить Derived в поток:
thread = std::thread([d = Derived{}]() mutable { d.callback(); };
Это перемещает переменную потока из класса.
Третьим решением может быть помещение Derived в shared_ptr и использованиеконструктор псевдонимов shared_ptr для создания общего указателя потоков.Я не работаю с этим, так как это может быть слишком сложно, и вы также можете поместить shared_ptr в качестве захвата в вашу лямбду.