shared_mutex_locking_thread.hpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #ifndef SHARED_MUTEX_LOCKING_THREAD_HPP
  2. #define SHARED_MUTEX_LOCKING_THREAD_HPP
  3. // (C) Copyright 2008 Anthony Williams
  4. //
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #include <boost/thread/mutex.hpp>
  9. #include <boost/thread/condition_variable.hpp>
  10. #include <boost/thread/shared_mutex.hpp>
  11. template<typename lock_type>
  12. class locking_thread
  13. {
  14. boost::shared_mutex& rw_mutex;
  15. unsigned& unblocked_count;
  16. boost::condition_variable& unblocked_condition;
  17. unsigned& simultaneous_running_count;
  18. unsigned& max_simultaneous_running;
  19. boost::mutex& unblocked_count_mutex;
  20. boost::mutex& finish_mutex;
  21. public:
  22. locking_thread(boost::shared_mutex& rw_mutex_,
  23. unsigned& unblocked_count_,
  24. boost::mutex& unblocked_count_mutex_,
  25. boost::condition_variable& unblocked_condition_,
  26. boost::mutex& finish_mutex_,
  27. unsigned& simultaneous_running_count_,
  28. unsigned& max_simultaneous_running_):
  29. rw_mutex(rw_mutex_),
  30. unblocked_count(unblocked_count_),
  31. unblocked_condition(unblocked_condition_),
  32. simultaneous_running_count(simultaneous_running_count_),
  33. max_simultaneous_running(max_simultaneous_running_),
  34. unblocked_count_mutex(unblocked_count_mutex_),
  35. finish_mutex(finish_mutex_)
  36. {}
  37. void operator()()
  38. {
  39. // acquire lock
  40. lock_type lock(rw_mutex);
  41. // increment count to show we're unblocked
  42. {
  43. boost::unique_lock<boost::mutex> ublock(unblocked_count_mutex);
  44. ++unblocked_count;
  45. unblocked_condition.notify_one();
  46. ++simultaneous_running_count;
  47. if(simultaneous_running_count>max_simultaneous_running)
  48. {
  49. max_simultaneous_running=simultaneous_running_count;
  50. }
  51. }
  52. // wait to finish
  53. boost::unique_lock<boost::mutex> finish_lock(finish_mutex);
  54. {
  55. boost::unique_lock<boost::mutex> ublock(unblocked_count_mutex);
  56. --simultaneous_running_count;
  57. }
  58. }
  59. private:
  60. void operator=(locking_thread&);
  61. };
  62. class simple_writing_thread
  63. {
  64. boost::shared_mutex& rwm;
  65. boost::mutex& finish_mutex;
  66. boost::mutex& unblocked_mutex;
  67. unsigned& unblocked_count;
  68. void operator=(simple_writing_thread&);
  69. public:
  70. simple_writing_thread(boost::shared_mutex& rwm_,
  71. boost::mutex& finish_mutex_,
  72. boost::mutex& unblocked_mutex_,
  73. unsigned& unblocked_count_):
  74. rwm(rwm_),finish_mutex(finish_mutex_),
  75. unblocked_mutex(unblocked_mutex_),unblocked_count(unblocked_count_)
  76. {}
  77. void operator()()
  78. {
  79. boost::unique_lock<boost::shared_mutex> lk(rwm);
  80. {
  81. boost::unique_lock<boost::mutex> ulk(unblocked_mutex);
  82. ++unblocked_count;
  83. }
  84. boost::unique_lock<boost::mutex> flk(finish_mutex);
  85. }
  86. };
  87. class simple_reading_thread
  88. {
  89. boost::shared_mutex& rwm;
  90. boost::mutex& finish_mutex;
  91. boost::mutex& unblocked_mutex;
  92. unsigned& unblocked_count;
  93. void operator=(simple_reading_thread&);
  94. public:
  95. simple_reading_thread(boost::shared_mutex& rwm_,
  96. boost::mutex& finish_mutex_,
  97. boost::mutex& unblocked_mutex_,
  98. unsigned& unblocked_count_):
  99. rwm(rwm_),finish_mutex(finish_mutex_),
  100. unblocked_mutex(unblocked_mutex_),unblocked_count(unblocked_count_)
  101. {}
  102. void operator()()
  103. {
  104. boost::shared_lock<boost::shared_mutex> lk(rwm);
  105. {
  106. boost::unique_lock<boost::mutex> ulk(unblocked_mutex);
  107. ++unblocked_count;
  108. }
  109. boost::unique_lock<boost::mutex> flk(finish_mutex);
  110. }
  111. };
  112. #endif