test_pthread_cxx.cpp 2.2 KB

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