TestSharedMutexBenchmark.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * std::shared_mutex与std::mutex的性能对比
  3. * zhangyl 2016.11.10
  4. */
  5. //读线程数量
  6. #define READER_THREAD_COUNT 8
  7. //最大循环次数
  8. #define LOOP_COUNT 5000000
  9. #include <iostream>
  10. #include <mutex>
  11. #include <shared_mutex>
  12. #include <thread>
  13. class shared_mutex_counter
  14. {
  15. public:
  16. shared_mutex_counter() = default;
  17. ~shared_mutex_counter() = default;
  18. //使用std::shared_mutex,同一时刻多个读线程可以同时访问value_值
  19. unsigned int get() const
  20. {
  21. //注意:这里使用std::shared_lock
  22. std::shared_lock<std::shared_mutex> lock(mutex_);
  23. return value_;
  24. }
  25. //使用std::shared_mutex,同一个时刻仅有一个写线程可以修改value_值
  26. void increment()
  27. {
  28. //注意:这里使用std::unique_lock
  29. std::unique_lock<std::shared_mutex> lock(mutex_);
  30. value_++;
  31. }
  32. //使用std::shared_mutex,同一个时刻仅有一个写线程可以重置value_值
  33. void reset()
  34. {
  35. //注意:这里使用std::unique_lock
  36. std::unique_lock<std::shared_mutex> lock(mutex_);
  37. value_ = 0;
  38. }
  39. private:
  40. mutable std::shared_mutex mutex_;
  41. //value_是多个线程的共享资源
  42. unsigned int value_ = 0;
  43. };
  44. class mutex_counter
  45. {
  46. public:
  47. mutex_counter() = default;
  48. ~mutex_counter() = default;
  49. //使用std::mutex,同一时刻仅有一个线程可以访问value_的值
  50. unsigned int get() const
  51. {
  52. std::unique_lock<std::mutex> lk(mutex_);
  53. return value_;
  54. }
  55. //使用std::mutex,同一时刻仅有一个线程可以修改value_的值
  56. void increment()
  57. {
  58. std::unique_lock<std::mutex> lk(mutex_);
  59. value_++;
  60. }
  61. private:
  62. mutable std::mutex mutex_;
  63. //value_是多个线程的共享资源
  64. unsigned int value_ = 0;
  65. };
  66. //测试std::shared_mutex
  67. void test_shared_mutex()
  68. {
  69. shared_mutex_counter counter;
  70. int temp;
  71. //写线程函数
  72. auto writer = [&counter]() {
  73. for (int i = 0; i < LOOP_COUNT; i++)
  74. {
  75. counter.increment();
  76. }
  77. };
  78. //读线程函数
  79. auto reader = [&counter, &temp]() {
  80. for (int i = 0; i < LOOP_COUNT; i++)
  81. {
  82. temp = counter.get();
  83. }
  84. };
  85. //存放读线程对象指针的数组
  86. std::thread** tarray = new std::thread * [READER_THREAD_COUNT];
  87. //记录起始时间
  88. clock_t start = clock();
  89. //创建READER_THREAD_COUNT个读线程
  90. for (int i = 0; i < READER_THREAD_COUNT; i++)
  91. {
  92. tarray[i] = new std::thread(reader);
  93. }
  94. //创建一个写线程
  95. std::thread tw(writer);
  96. for (int i = 0; i < READER_THREAD_COUNT; i++)
  97. {
  98. tarray[i]->join();
  99. }
  100. tw.join();
  101. //记录起始时间
  102. clock_t end = clock();
  103. printf("[test_shared_mutex]\n");
  104. printf("thread count: %d\n", READER_THREAD_COUNT);
  105. printf("result: %d cost: %dms temp: %d \n", counter.get(), end - start, temp);
  106. }
  107. //测试std::mutex
  108. void test_mutex()
  109. {
  110. mutex_counter counter;
  111. int temp;
  112. //写线程函数
  113. auto writer = [&counter]() {
  114. for (int i = 0; i < LOOP_COUNT; i++)
  115. {
  116. counter.increment();
  117. }
  118. };
  119. //读线程函数
  120. auto reader = [&counter, &temp]() {
  121. for (int i = 0; i < LOOP_COUNT; i++)
  122. {
  123. temp = counter.get();
  124. }
  125. };
  126. //存放读线程对象指针的数组
  127. std::thread** tarray = new std::thread * [READER_THREAD_COUNT];
  128. //记录起始时间
  129. clock_t start = clock();
  130. //创建READER_THREAD_COUNT个读线程
  131. for (int i = 0; i < READER_THREAD_COUNT; i++)
  132. {
  133. tarray[i] = new std::thread(reader);
  134. }
  135. //创建一个写线程
  136. std::thread tw(writer);
  137. for (int i = 0; i < READER_THREAD_COUNT; i++)
  138. {
  139. tarray[i]->join();
  140. }
  141. tw.join();
  142. //记录结束时间
  143. clock_t end = clock();
  144. printf("[test_mutex]\n");
  145. printf("thread count:%d\n", READER_THREAD_COUNT);
  146. printf("result:%d cost:%dms temp:%d \n", counter.get(), end - start, temp);
  147. }
  148. int main()
  149. {
  150. //为了排除测试程序的无关因素,测试时只开启一个
  151. test_mutex();
  152. //test_shared_mutex();
  153. return 0;
  154. }