#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
struct Base {
void init() { t = std::thread{&Base::threadFunc, this}; }
virtual void threadFunc() = 0;
virtual ~Base() {
std::cout << "Base::~Base() ENTER" << std::endl;
if (t.joinable()) {
std::this_thread::sleep_for(std::chrono::seconds(1));
dead.store(true);
t.join();
}
std::cout << "Base::~Base() DONE" << std::endl;
};
std::atomic<bool> dead{false};
std::thread t;
};
struct Derived : Base {
~Derived() override {
std::cout << "Derived::~Derived - DESTROYING!!!" << std::endl;
}
void threadFunc() override {
std::cout << "Derived::threadFunc ENTER" << std::endl;
while (!dead.load()) {
std::cout << "Derived::threadFunc ACCESSING Derived" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
std::cout << "Derived::threadFunc ENTER" << std::endl;
}
};
int main() {
Derived d;
d.init();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
I2luY2x1ZGUgPGF0b21pYz4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgoKc3RydWN0IEJhc2UgewogIHZvaWQgaW5pdCgpIHsgdCA9IHN0ZDo6dGhyZWFkeyZCYXNlOjp0aHJlYWRGdW5jLCB0aGlzfTsgfQogIAogIHZpcnR1YWwgdm9pZCB0aHJlYWRGdW5jKCkgPSAwOwogIAogIHZpcnR1YWwgfkJhc2UoKSB7CiAgCXN0ZDo6Y291dCA8PCAiQmFzZTo6fkJhc2UoKSBFTlRFUiIgPDwgc3RkOjplbmRsOwogIAlpZiAodC5qb2luYWJsZSgpKSB7CiAgCQlzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwogIAkJZGVhZC5zdG9yZSh0cnVlKTsKICAJCXQuam9pbigpOwogIAl9CiAgCXN0ZDo6Y291dCA8PCAiQmFzZTo6fkJhc2UoKSBET05FIiA8PCBzdGQ6OmVuZGw7CiAgfTsKICAKICBzdGQ6OmF0b21pYzxib29sPiBkZWFke2ZhbHNlfTsKICBzdGQ6OnRocmVhZCB0Owp9OwoKc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKCX5EZXJpdmVkKCkgb3ZlcnJpZGUgewoJCXN0ZDo6Y291dCA8PCAiRGVyaXZlZDo6fkRlcml2ZWQgLSBERVNUUk9ZSU5HISEhIiA8PCBzdGQ6OmVuZGw7Cgl9Cgl2b2lkIHRocmVhZEZ1bmMoKSBvdmVycmlkZSB7CgkJc3RkOjpjb3V0IDw8ICJEZXJpdmVkOjp0aHJlYWRGdW5jIEVOVEVSIiA8PCBzdGQ6OmVuZGw7CgkJd2hpbGUgKCFkZWFkLmxvYWQoKSkgewoJCQlzdGQ6OmNvdXQgPDwgIkRlcml2ZWQ6OnRocmVhZEZ1bmMgQUNDRVNTSU5HIERlcml2ZWQiIDw8IHN0ZDo6ZW5kbDsKCQkJc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7CgkJfQoJCXN0ZDo6Y291dCA8PCAiRGVyaXZlZDo6dGhyZWFkRnVuYyBFTlRFUiIgPDwgc3RkOjplbmRsOwoJfQp9OwoKaW50IG1haW4oKSB7CglEZXJpdmVkIGQ7CglkLmluaXQoKTsKCXN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Cn0=