test_pthread_cxx.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <iostream>
  2. #include <thread>
  3. #include <mutex>
  4. #include "unity.h"
  5. #if __GTHREADS && __GTHREADS_CXX0X
  6. static std::shared_ptr<int> global_sp;
  7. static std::mutex mtx;
  8. static std::recursive_mutex recur_mtx;
  9. static void thread_do_nothing() {}
  10. static void thread_main()
  11. {
  12. int i = 0;
  13. std::cout << "thread_main CXX " << std::hex << std::this_thread::get_id() << std::endl;
  14. while (i < 3) {
  15. int old_val, new_val;
  16. // mux test
  17. mtx.lock();
  18. old_val = *global_sp;
  19. std::this_thread::yield();
  20. (*global_sp)++;
  21. std::this_thread::yield();
  22. new_val = *global_sp;
  23. mtx.unlock();
  24. std::cout << "thread " << std::hex << std::this_thread::get_id() << ": " << i++ << " val= " << *global_sp << std::endl;
  25. TEST_ASSERT_TRUE(new_val == old_val + 1);
  26. // sleep_for test
  27. std::chrono::milliseconds dur(300);
  28. std::this_thread::sleep_for(dur);
  29. // recursive mux test
  30. recur_mtx.lock();
  31. recur_mtx.lock();
  32. old_val = *global_sp;
  33. std::this_thread::yield();
  34. (*global_sp)++;
  35. std::this_thread::yield();
  36. new_val = *global_sp;
  37. recur_mtx.unlock();
  38. recur_mtx.unlock();
  39. std::cout << "thread " << std::hex << std::this_thread::get_id() << ": " << i++ << " val= " << *global_sp << std::endl;
  40. TEST_ASSERT_TRUE(new_val == old_val + 1);
  41. // sleep_until test
  42. using std::chrono::system_clock;
  43. std::time_t tt = system_clock::to_time_t(system_clock::now());
  44. struct std::tm *ptm = std::localtime(&tt);
  45. ptm->tm_sec++;
  46. std::this_thread::sleep_until(system_clock::from_time_t (mktime(ptm)));
  47. }
  48. }
  49. TEST_CASE("pthread CXX", "[pthread]")
  50. {
  51. global_sp.reset(new int(1));
  52. std::thread t1(thread_do_nothing);
  53. t1.join();
  54. std::thread t2(thread_main);
  55. std::cout << "Detach thread " << std::hex << t2.get_id() << std::endl;
  56. t2.detach();
  57. TEST_ASSERT_FALSE(t2.joinable());
  58. std::thread t3(thread_main);
  59. std::thread t4(thread_main);
  60. if (t3.joinable()) {
  61. std::cout << "Join thread " << std::hex << t3.get_id() << std::endl;
  62. t3.join();
  63. }
  64. if (t4.joinable()) {
  65. std::cout << "Join thread " << std::hex << t4.get_id() << std::endl;
  66. t4.join();
  67. }
  68. }
  69. #endif