#ifndef SHARED_MUTEX_LOCKING_THREAD_HPP #define SHARED_MUTEX_LOCKING_THREAD_HPP #include #include #include template class locking_thread { boost::shared_mutex& rw_mutex; unsigned& unblocked_count; boost::condition_variable& unblocked_condition; unsigned& simultaneous_running_count; unsigned& max_simultaneous_running; boost::mutex& unblocked_count_mutex; boost::mutex& finish_mutex; public: locking_thread(boost::shared_mutex& rw_mutex_, unsigned& unblocked_count_, boost::mutex& unblocked_count_mutex_, boost::condition_variable& unblocked_condition_, boost::mutex& finish_mutex_, unsigned& simultaneous_running_count_, unsigned& max_simultaneous_running_): rw_mutex(rw_mutex_), unblocked_count(unblocked_count_), unblocked_condition(unblocked_condition_), simultaneous_running_count(simultaneous_running_count_), max_simultaneous_running(max_simultaneous_running_), unblocked_count_mutex(unblocked_count_mutex_), finish_mutex(finish_mutex_) {} void operator()() { // acquire lock lock_type lock(rw_mutex); // increment count to show we're unblocked { boost::mutex::scoped_lock ublock(unblocked_count_mutex); ++unblocked_count; unblocked_condition.notify_one(); ++simultaneous_running_count; if(simultaneous_running_count>max_simultaneous_running) { max_simultaneous_running=simultaneous_running_count; } } // wait to finish boost::mutex::scoped_lock finish_lock(finish_mutex); { boost::mutex::scoped_lock ublock(unblocked_count_mutex); --simultaneous_running_count; } } }; #endif