fork(1) download
  1. #include <iostream>
  2. #include <memory>
  3. #include <thread>
  4. #include <chrono>
  5.  
  6. class Executor
  7. {
  8. public:
  9. // constructor
  10. Executor();
  11.  
  12. // destructor
  13. virtual ~Executor();
  14.  
  15. // kick thread execution
  16. void Kick();
  17.  
  18. private:
  19. // thread execution function
  20. virtual void StartExecution() { std::cout << "Executor::Kick\n"; }
  21.  
  22. // thread handle
  23. std::thread mThreadHandle;
  24. };
  25.  
  26. Executor::Executor()
  27. {
  28. // Nothing to be done here
  29. }
  30.  
  31. Executor::~Executor()
  32. {
  33. std::cout << "~Executor\n";
  34. if (mThreadHandle.joinable())
  35. mThreadHandle.join();
  36. }
  37.  
  38. void Executor::Kick()
  39. {
  40. // mThreadHandle = std::thread(&Executor::StartExecution, this);
  41. mThreadHandle = std::thread([this] {this->StartExecution();});
  42. }
  43.  
  44.  
  45. class Consumer: public Executor {
  46. public:
  47. ~Consumer() {
  48. std::cout << "~Consumer\n";
  49. }
  50. private:
  51. virtual void StartExecution() { std::cout << "Consumer::Kick\n"; }
  52. };
  53.  
  54. int main() {
  55. {
  56. std::cout << "1:\n";
  57. std::unique_ptr<Consumer> consumer = std::make_unique<Consumer>();
  58. consumer->Kick();
  59. }
  60. {
  61. std::cout << "2:\n";
  62. std::unique_ptr<Consumer> consumer = std::make_unique<Consumer>();
  63. consumer->Kick();
  64. std::cout << "Sleeping for a bit\n";
  65. std::this_thread::sleep_for(std::chrono::seconds(1));
  66. }
  67. return 0;
  68. }
Success #stdin #stdout 0s 4508KB
stdin
Standard input is empty
stdout
1:
~Consumer
~Executor
Executor::Kick
2:
Sleeping for a bit
Consumer::Kick
~Consumer
~Executor