#include <iostream>
#include <memory>
#include <thread>
#include <chrono>
class Executor
{
public:
// constructor
Executor();
// destructor
virtual ~Executor();
// kick thread execution
void Kick();
private:
// thread execution function
virtual void StartExecution() { std::cout << "Executor::Kick\n"; }
// thread handle
std::thread mThreadHandle;
};
Executor::Executor()
{
// Nothing to be done here
}
Executor::~Executor()
{
std::cout << "~Executor\n";
if (mThreadHandle.joinable())
mThreadHandle.join();
}
void Executor::Kick()
{
// mThreadHandle = std::thread(&Executor::StartExecution, this);
mThreadHandle = std::thread([this] {this->StartExecution();});
}
class Consumer: public Executor {
public:
~Consumer() {
std::cout << "~Consumer\n";
}
private:
virtual void StartExecution() { std::cout << "Consumer::Kick\n"; }
};
int main() {
{
std::cout << "1:\n";
std::unique_ptr<Consumer> consumer = std::make_unique<Consumer>();
consumer->Kick();
}
{
std::cout << "2:\n";
std::unique_ptr<Consumer> consumer = std::make_unique<Consumer>();
consumer->Kick();
std::cout << "Sleeping for a bit\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8Y2hyb25vPgoKY2xhc3MgRXhlY3V0b3IKewpwdWJsaWM6CiAgICAvLyBjb25zdHJ1Y3RvcgogICAgRXhlY3V0b3IoKTsKCiAgICAvLyBkZXN0cnVjdG9yCiAgICB2aXJ0dWFsIH5FeGVjdXRvcigpOwoKICAgIC8vIGtpY2sgdGhyZWFkIGV4ZWN1dGlvbgogICAgdm9pZCBLaWNrKCk7Cgpwcml2YXRlOgogICAgLy8gdGhyZWFkIGV4ZWN1dGlvbiBmdW5jdGlvbgogICAgdmlydHVhbCB2b2lkIFN0YXJ0RXhlY3V0aW9uKCkgeyBzdGQ6OmNvdXQgPDwgIkV4ZWN1dG9yOjpLaWNrXG4iOyB9CgogICAgLy8gdGhyZWFkIGhhbmRsZQogICAgc3RkOjp0aHJlYWQgbVRocmVhZEhhbmRsZTsKfTsKCkV4ZWN1dG9yOjpFeGVjdXRvcigpCnsKICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlCn0KCkV4ZWN1dG9yOjp+RXhlY3V0b3IoKQp7CiAgICBzdGQ6OmNvdXQgPDwgIn5FeGVjdXRvclxuIjsKICAgIGlmIChtVGhyZWFkSGFuZGxlLmpvaW5hYmxlKCkpCiAgICAgICAgbVRocmVhZEhhbmRsZS5qb2luKCk7Cn0KCnZvaWQgRXhlY3V0b3I6OktpY2soKQp7CiAgICAvLyBtVGhyZWFkSGFuZGxlID0gc3RkOjp0aHJlYWQoJkV4ZWN1dG9yOjpTdGFydEV4ZWN1dGlvbiwgdGhpcyk7CiAgICBtVGhyZWFkSGFuZGxlID0gc3RkOjp0aHJlYWQoW3RoaXNdIHt0aGlzLT5TdGFydEV4ZWN1dGlvbigpO30pOwp9CgoKY2xhc3MgQ29uc3VtZXI6IHB1YmxpYyBFeGVjdXRvciB7CnB1YmxpYzoKICAgIH5Db25zdW1lcigpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIn5Db25zdW1lclxuIjsKICAgIH0KcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9pZCBTdGFydEV4ZWN1dGlvbigpIHsgc3RkOjpjb3V0IDw8ICJDb25zdW1lcjo6S2lja1xuIjsgfQp9OwoKaW50IG1haW4oKSB7CiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIxOlxuIjsKICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uc3VtZXI+IGNvbnN1bWVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb25zdW1lcj4oKTsKICAgICAgICBjb25zdW1lci0+S2ljaygpOwogICAgfQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiMjpcbiI7CiAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbnN1bWVyPiBjb25zdW1lciA9IHN0ZDo6bWFrZV91bmlxdWU8Q29uc3VtZXI+KCk7CiAgICAgICAgY29uc3VtZXItPktpY2soKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlNsZWVwaW5nIGZvciBhIGJpdFxuIjsKICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=