shared_mutex_locking_thread.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 133 行
HPP
133 行
#ifndef SHARED_MUTEX_LOCKING_THREAD_HPP#define SHARED_MUTEX_LOCKING_THREAD_HPP// (C) Copyright 2008 Anthony Williams//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#include <boost/thread/mutex.hpp>#include <boost/thread/condition_variable.hpp>#include <boost/thread/shared_mutex.hpp>template<typename lock_type>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; } }private: void operator=(locking_thread&);};class simple_writing_thread{ boost::shared_mutex& rwm; boost::mutex& finish_mutex; boost::mutex& unblocked_mutex; unsigned& unblocked_count; void operator=(simple_writing_thread&); public: simple_writing_thread(boost::shared_mutex& rwm_, boost::mutex& finish_mutex_, boost::mutex& unblocked_mutex_, unsigned& unblocked_count_): rwm(rwm_),finish_mutex(finish_mutex_), unblocked_mutex(unblocked_mutex_),unblocked_count(unblocked_count_) {} void operator()() { boost::unique_lock<boost::shared_mutex> lk(rwm); { boost::mutex::scoped_lock ulk(unblocked_mutex); ++unblocked_count; } boost::mutex::scoped_lock flk(finish_mutex); }};class simple_reading_thread{ boost::shared_mutex& rwm; boost::mutex& finish_mutex; boost::mutex& unblocked_mutex; unsigned& unblocked_count; void operator=(simple_reading_thread&); public: simple_reading_thread(boost::shared_mutex& rwm_, boost::mutex& finish_mutex_, boost::mutex& unblocked_mutex_, unsigned& unblocked_count_): rwm(rwm_),finish_mutex(finish_mutex_), unblocked_mutex(unblocked_mutex_),unblocked_count(unblocked_count_) {} void operator()() { boost::shared_lock<boost::shared_mutex> lk(rwm); { boost::mutex::scoped_lock ulk(unblocked_mutex); ++unblocked_count; } boost::mutex::scoped_lock flk(finish_mutex); }};#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?