#c #multithreading #polymorphism
#c #многопоточность #полиморфизм
Вопрос:
Существует класс «Mario». У этого есть виртуальный метод: void mission()
. Я хочу переопределить этот метод и запустить его из кода базового класса параллельно.
Но вывод следующего кода:
Mario works hard
LOL
Код:
#include <iostream>
#include <thread>
class Mario
{
std::thread workingField;
bool hasStarted = false;
public:
virtual void mission()
{
std::cout << "LOL" << std::endl;
}
void startMission()
{
if (!hasStarted)
{
workingField = std::thread([this]() {
this->mission();
});
hasStarted = true;
}
}
virtual ~Mario()
{
if (hasStarted)
{
workingField.join();
}
}
};
class MarioWorker : public Mario
{
public:
void mission() override final
{
std::cout << "Mario works hard" << std::endl;
}
};
int main(int argc, char *argv[])
{
MarioWorker mw;
mw.mission();
mw.startMission();
}
Как я могу получить двойную строку «Марио усердно работает», когда один из них выполняется в другом потоке?
Другими словами, как базовый класс может выполнять переопределенный метод параллельно?
Я использую GCC 9.3
Ответ №1:
Проблема в том, что основной поток слишком быстрый. Ваш основной метод заканчивается, начинается деконструкция mw
, MarioWorker
уничтожается, и как только он начинает разрушать Mario
, он присоединяется к потоку. Поток никогда не видит MarioWorker
, поскольку он уже был уничтожен, все, что он видит, это Mario
.