1 #ifndef SHARED_MUTEX_LOCKING_THREAD_HPP
2 #define SHARED_MUTEX_LOCKING_THREAD_HPP
4 // (C) Copyright 2008 Anthony Williams
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
10 #include <boost/thread/mutex.hpp>
11 #include <boost/thread/condition_variable.hpp>
12 #include <boost/thread/shared_mutex.hpp>
14 template<typename lock_type>
17 boost::shared_mutex& rw_mutex;
18 unsigned& unblocked_count;
19 boost::condition_variable& unblocked_condition;
20 unsigned& simultaneous_running_count;
21 unsigned& max_simultaneous_running;
22 boost::mutex& unblocked_count_mutex;
23 boost::mutex& finish_mutex;
25 locking_thread(boost::shared_mutex& rw_mutex_,
26 unsigned& unblocked_count_,
27 boost::mutex& unblocked_count_mutex_,
28 boost::condition_variable& unblocked_condition_,
29 boost::mutex& finish_mutex_,
30 unsigned& simultaneous_running_count_,
31 unsigned& max_simultaneous_running_):
33 unblocked_count(unblocked_count_),
34 unblocked_condition(unblocked_condition_),
35 simultaneous_running_count(simultaneous_running_count_),
36 max_simultaneous_running(max_simultaneous_running_),
37 unblocked_count_mutex(unblocked_count_mutex_),
38 finish_mutex(finish_mutex_)
44 lock_type lock(rw_mutex);
46 // increment count to show we're unblocked
48 boost::mutex::scoped_lock ublock(unblocked_count_mutex);
50 unblocked_condition.notify_one();
51 ++simultaneous_running_count;
52 if(simultaneous_running_count>max_simultaneous_running)
54 max_simultaneous_running=simultaneous_running_count;
59 boost::mutex::scoped_lock finish_lock(finish_mutex);
61 boost::mutex::scoped_lock ublock(unblocked_count_mutex);
62 --simultaneous_running_count;
66 void operator=(locking_thread&);
69 class simple_writing_thread
71 boost::shared_mutex& rwm;
72 boost::mutex& finish_mutex;
73 boost::mutex& unblocked_mutex;
74 unsigned& unblocked_count;
76 void operator=(simple_writing_thread&);
79 simple_writing_thread(boost::shared_mutex& rwm_,
80 boost::mutex& finish_mutex_,
81 boost::mutex& unblocked_mutex_,
82 unsigned& unblocked_count_):
83 rwm(rwm_),finish_mutex(finish_mutex_),
84 unblocked_mutex(unblocked_mutex_),unblocked_count(unblocked_count_)
89 boost::unique_lock<boost::shared_mutex> lk(rwm);
92 boost::mutex::scoped_lock ulk(unblocked_mutex);
96 boost::mutex::scoped_lock flk(finish_mutex);
100 class simple_reading_thread
102 boost::shared_mutex& rwm;
103 boost::mutex& finish_mutex;
104 boost::mutex& unblocked_mutex;
105 unsigned& unblocked_count;
107 void operator=(simple_reading_thread&);
110 simple_reading_thread(boost::shared_mutex& rwm_,
111 boost::mutex& finish_mutex_,
112 boost::mutex& unblocked_mutex_,
113 unsigned& unblocked_count_):
114 rwm(rwm_),finish_mutex(finish_mutex_),
115 unblocked_mutex(unblocked_mutex_),unblocked_count(unblocked_count_)
120 boost::shared_lock<boost::shared_mutex> lk(rwm);
123 boost::mutex::scoped_lock ulk(unblocked_mutex);
127 boost::mutex::scoped_lock flk(finish_mutex);