test_cxx_cond_var.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <iostream>
  2. #include <thread>
  3. #include <condition_variable>
  4. #include <chrono>
  5. #include <mutex>
  6. #include <atomic>
  7. #include "unity.h"
  8. #if __GTHREADS && __GTHREADS_CXX0X
  9. std::condition_variable cv;
  10. std::mutex cv_m;
  11. std::atomic<int> i{0};
  12. static void waits(int idx, int timeout_ms)
  13. {
  14. std::unique_lock<std::mutex> lk(cv_m);
  15. auto now = std::chrono::system_clock::now();
  16. if(cv.wait_until(lk, now + std::chrono::milliseconds(timeout_ms), [](){return i == 1;}))
  17. std::cout << "Thread " << idx << " finished waiting. i == " << i << '\n';
  18. else
  19. std::cout << "Thread " << idx << " timed out. i == " << i << '\n';
  20. }
  21. static void signals(int signal_ms)
  22. {
  23. std::this_thread::sleep_for(std::chrono::milliseconds(signal_ms));
  24. std::cout << "Notifying...\n";
  25. cv.notify_all();
  26. std::this_thread::sleep_for(std::chrono::milliseconds(signal_ms));
  27. i = 1;
  28. std::cout << "Notifying again...\n";
  29. cv.notify_all();
  30. }
  31. TEST_CASE("C++ condition_variable", "[std::condition_variable]")
  32. {
  33. i = 0;
  34. std::thread t1(waits, 1, 100), t2(waits, 2, 800), t3(signals, 200);
  35. t1.join();
  36. t2.join();
  37. t3.join();
  38. std::cout << "All threads joined\n";
  39. }
  40. #endif