Advertisement
MaestroMaus

AsyncFunctionExample

Aug 15th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <functional>
  3. #include <atomic>
  4. #include <iostream>
  5. #include <future>
  6.  
  7. class AsyncFunctionExample
  8. {
  9. std::atomic<bool> var_1;
  10. std::atomic<bool> var_2;
  11. std::atomic<bool> is_finished;
  12. std::function<void(AsyncFunctionExample&)> current_function;
  13.  
  14. void Function1()
  15. {
  16.   if(!var_1 && !var_2)
  17.   {
  18.     var_1 = true;
  19.     current_function = &AsyncFunctionExample::Function2;
  20.   }
  21.   else if(var_1 && var_2)
  22.   {
  23.     is_finished = true;
  24.     current_function = nullptr;
  25.   }
  26. }
  27.  
  28. void Function2()
  29. {
  30.   if(var_1 && !var_2)
  31.   {
  32.     var_2 = true;
  33.     current_function = &AsyncFunctionExample::Function1;
  34.   }
  35. }
  36.  
  37. void Test1()
  38. {
  39.   // this works
  40.   var_1 = false;
  41.   var_2 = false;
  42.   is_finished = false;
  43.   current_function = &AsyncFunctionExample::Function1;
  44.   while(current_function != nullptr)
  45.     current_function(*this);
  46. }
  47.  
  48. void Test2()
  49. {
  50.   // this works
  51.   var_1 = false;
  52.   var_2 = false;
  53.   is_finished = false;
  54.   current_function = &AsyncFunctionExample::Function1;
  55.   while(current_function != nullptr)
  56.   {
  57.     const std::future<void> function_future = std::async([&](){current_function(*this); });
  58.     function_future.wait();
  59.   }
  60. }
  61.  
  62. void Test3()
  63. {
  64.   var_1 = false;
  65.   var_2 = false;
  66.   is_finished = false;
  67.   current_function = &AsyncFunctionExample::Function1;
  68.   while(current_function != nullptr)
  69.   {
  70.     const std::future<void> function_future = std::async(current_function, *this);
  71.     function_future.wait();
  72.   }
  73. }
  74.  
  75.  public:
  76. void Run()
  77. {
  78.   Test1();
  79.   if(!is_finished)
  80.     std::cerr << "Test 1 fails." << "\r\n";
  81.   else
  82.     std::cerr << "Test 1 succeeds." << "\r\n";
  83.  
  84.   Test2();
  85.   if(!is_finished)
  86.     std::cerr << "Test 2 fails." << "\r\n";
  87.   else
  88.     std::cerr << "Test 2 succeeds." << "\r\n";
  89.  
  90.   Test3();
  91.   if(!is_finished)
  92.     std::cerr << "Test 3 fails." << "\r\n";
  93.   else
  94.     std::cerr << "Test 3 succeeds." << "\r\n";
  95. }
  96. };
  97.  
  98. int main() {
  99.   AsyncFunctionExample afe;
  100.   afe.Run();
  101.   return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement