fork download
  1. #include <atomic>
  2. #include <chrono>
  3. #include <iostream>
  4. #include <thread>
  5.  
  6. struct Base {
  7. void init() { t = std::thread{&Base::threadFunc, this}; }
  8.  
  9. virtual void threadFunc() = 0;
  10.  
  11. virtual ~Base() {
  12. std::cout << "Base::~Base() ENTER" << std::endl;
  13. if (t.joinable()) {
  14. std::this_thread::sleep_for(std::chrono::seconds(1));
  15. dead.store(true);
  16. t.join();
  17. }
  18. std::cout << "Base::~Base() DONE" << std::endl;
  19. };
  20.  
  21. std::atomic<bool> dead{false};
  22. std::thread t;
  23. };
  24.  
  25. struct Derived : Base {
  26. ~Derived() override {
  27. std::cout << "Derived::~Derived - DESTROYING!!!" << std::endl;
  28. }
  29. void threadFunc() override {
  30. std::cout << "Derived::threadFunc ENTER" << std::endl;
  31. while (!dead.load()) {
  32. std::cout << "Derived::threadFunc ACCESSING Derived" << std::endl;
  33. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  34. }
  35. std::cout << "Derived::threadFunc ENTER" << std::endl;
  36. }
  37. };
  38.  
  39. int main() {
  40. Derived d;
  41. d.init();
  42. std::this_thread::sleep_for(std::chrono::seconds(1));
  43. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Derived::threadFunc ENTER
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::~Derived - DESTROYING!!!
Base::~Base() ENTER
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ACCESSING Derived
Derived::threadFunc ENTER
Base::~Base() DONE