Cannon запускает переопределенный метод

#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 .