Я пытаюсь реализовать полиморфизм, где производный класс реализует метод, который запускается в отдельном потоке:
#include <memory>
#include <thread>
#include <chrono>
class Base
{
public:
std::thread m_jobThread;
~Base() { if (m_jobThread.joinable()) m_jobThread.join(); }
virtual void doJob() = 0;
void doJobInBackground() { m_jobThread = std::thread(&Base::doJob, this); }
};
class Drived : public Base
{
public:
Drived() = default;
virtual void doJob() final { std::this_thread::sleep_for(std::chrono::seconds(1)); }
};
int main(int argc, char const *argv[])
{
Drived d;
d.doJobInBackground();
return 0;
}
Как мне достичь этого безопасно, не получив исключение pure virtual method called
?
Я хочу иметь возможность уничтожать производные объекты, потенциально во время выполнения задания, и деструктор базового класса должен заниматься управлением потоком. но поскольку виртуальная таблица производного класса уничтожается до запуска деструктора базового класса, я получаю исключение чисто виртуального метода.
Я думал о добавлении метода stop
в деструктор производного класса, который обеспечивает соединение потока. Но это противоречит цели моего полиморфного дизайна, когда я хочу, чтобы производный класс отвечал ТОЛЬКО за определение метода doJob
, а не за прямую или косвенную обработку ресурсов базового класса, таких как поток ...
Есть идеи, если это возможно? Нужно ли менять свой дизайн?