read_write_mutex.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 274 行
HPP
274 行
// Copyright (C) 2002-2003// David Moore, William E. Kempf//// Permission to use, copy, modify, distribute and sell this software// and its documentation for any purpose is hereby granted without fee,// provided that the above copyright notice appear in all copies and// that both that copyright notice and this permission notice appear// in supporting documentation. David Moore makes no representations// about the suitability of this software for any purpose.// It is provided "as is" without express or implied warranty.// A Boost::threads implementation of a synchronization// primitive which can allow multiple readers or a single// writer to have access to a shared resource.#ifndef BOOST_READ_WRITE_MUTEX_JDM030602_HPP#define BOOST_READ_WRITE_MUTEX_JDM030602_HPP#include <boost/thread/detail/config.hpp>#include <boost/utility.hpp>#include <boost/thread/mutex.hpp>#include <boost/thread/detail/lock.hpp>#include <boost/thread/detail/read_write_lock.hpp>#include <boost/thread/condition.hpp>namespace boost {namespace read_write_scheduling_policy { enum read_write_scheduling_policy_enum { writer_priority, //Prefer writers; can starve readers reader_priority, //Prefer readers; can starve writers alternating_many_reads, //Alternate readers and writers; before a writer, release all queued readers alternating_single_read //Alternate readers and writers; before a writer, release only on queued reader };} // namespace read_write_scheduling_policynamespace detail {namespace thread {// Shared implementation construct for explicit Scheduling Policies// This implementation is susceptible to self-deadlock, though....template<typename Mutex>struct read_write_mutex_impl{ typedef Mutex mutex_type; typedef detail::thread::scoped_lock<Mutex> scoped_lock; typedef detail::thread::scoped_try_lock<Mutex> scoped_try_lock; typedef detail::thread::scoped_timed_lock<Mutex> scoped_timed_lock; read_write_mutex_impl(read_write_scheduling_policy::read_write_scheduling_policy_enum sp) : m_num_waiting_writers(0), m_num_waiting_readers(0), m_num_readers_to_wake(0), m_state_waiting_promotion(false), m_state(0), m_sp(sp), m_readers_next(true) { } Mutex m_prot; boost::condition m_waiting_writers; boost::condition m_waiting_readers; int m_num_waiting_writers; int m_num_waiting_readers; int m_num_readers_to_wake; boost::condition m_waiting_promotion; bool m_state_waiting_promotion; int m_state; // -1 = excl locked // 0 = unlocked // 1-> INT_MAX - shared locked const read_write_scheduling_policy::read_write_scheduling_policy_enum m_sp; bool m_readers_next; void do_read_lock(); void do_write_lock(); void do_write_unlock(); void do_read_unlock(); bool do_try_write_lock(); bool do_try_read_lock(); bool do_timed_write_lock(const xtime &xt); bool do_timed_read_lock(const xtime &xt); void do_demote_to_read_lock(); bool do_try_demote_to_read_lock(); bool do_timed_demote_to_read_lock(const xtime &xt); void do_promote_to_write_lock(); bool do_try_promote_to_write_lock(); bool do_timed_promote_to_write_lock(const xtime &xt); bool locked(); read_write_lock_state::read_write_lock_state_enum state();private: void do_unlock_scheduling_impl(); void do_timeout_scheduling_impl(); void do_demote_scheduling_impl(); void do_scheduling_impl(); bool do_demote_to_read_lock_impl();};} // namespace detail} // namespace threadclass BOOST_THREAD_DECL read_write_mutex : private noncopyable{public: read_write_mutex(read_write_scheduling_policy::read_write_scheduling_policy_enum sp) : m_impl(sp) { } ~read_write_mutex() { } read_write_scheduling_policy::read_write_scheduling_policy_enum policy() const { return m_impl.m_sp; } friend class detail::thread::read_write_lock_ops<read_write_mutex>; typedef detail::thread::scoped_read_write_lock< read_write_mutex> scoped_read_write_lock; typedef detail::thread::scoped_read_lock< read_write_mutex> scoped_read_lock; typedef detail::thread::scoped_write_lock< read_write_mutex> scoped_write_lock;private: // Operations that will eventually be done only // via lock types void do_write_lock(); void do_read_lock(); void do_write_unlock(); void do_read_unlock(); void do_demote_to_read_lock(); void do_promote_to_write_lock(); bool locked(); read_write_lock_state::read_write_lock_state_enum state(); detail::thread::read_write_mutex_impl<mutex> m_impl; };class BOOST_THREAD_DECL try_read_write_mutex : private noncopyable{public: try_read_write_mutex(read_write_scheduling_policy::read_write_scheduling_policy_enum sp) : m_impl(sp) { } ~try_read_write_mutex() { } read_write_scheduling_policy::read_write_scheduling_policy_enum policy() const { return m_impl.m_sp; } friend class detail::thread::read_write_lock_ops<try_read_write_mutex>; typedef detail::thread::scoped_read_write_lock< try_read_write_mutex> scoped_read_write_lock; typedef detail::thread::scoped_try_read_write_lock< try_read_write_mutex> scoped_try_read_write_lock; typedef detail::thread::scoped_read_lock< try_read_write_mutex> scoped_read_lock; typedef detail::thread::scoped_try_read_lock< try_read_write_mutex> scoped_try_read_lock; typedef detail::thread::scoped_write_lock< try_read_write_mutex> scoped_write_lock; typedef detail::thread::scoped_try_write_lock< try_read_write_mutex> scoped_try_write_lock;private: // Operations that will eventually be done only // via lock types void do_write_lock(); void do_read_lock(); void do_write_unlock(); void do_read_unlock(); bool do_try_write_lock(); bool do_try_read_lock(); void do_demote_to_read_lock(); bool do_try_demote_to_read_lock(); void do_promote_to_write_lock(); bool do_try_promote_to_write_lock(); bool locked(); read_write_lock_state::read_write_lock_state_enum state(); detail::thread::read_write_mutex_impl<try_mutex> m_impl; };class BOOST_THREAD_DECL timed_read_write_mutex : private noncopyable{public: timed_read_write_mutex(read_write_scheduling_policy::read_write_scheduling_policy_enum sp) : m_impl(sp) { } ~timed_read_write_mutex() { } read_write_scheduling_policy::read_write_scheduling_policy_enum policy() const { return m_impl.m_sp; } friend class detail::thread::read_write_lock_ops<timed_read_write_mutex>; typedef detail::thread::scoped_read_write_lock< timed_read_write_mutex> scoped_read_write_lock; typedef detail::thread::scoped_try_read_write_lock< timed_read_write_mutex> scoped_try_read_write_lock; typedef detail::thread::scoped_timed_read_write_lock< timed_read_write_mutex> scoped_timed_read_write_lock; typedef detail::thread::scoped_read_lock< timed_read_write_mutex> scoped_read_lock; typedef detail::thread::scoped_try_read_lock< timed_read_write_mutex> scoped_try_read_lock; typedef detail::thread::scoped_timed_read_lock< timed_read_write_mutex> scoped_timed_read_lock; typedef detail::thread::scoped_write_lock< timed_read_write_mutex> scoped_write_lock; typedef detail::thread::scoped_try_write_lock< timed_read_write_mutex> scoped_try_write_lock; typedef detail::thread::scoped_timed_write_lock< timed_read_write_mutex> scoped_timed_write_lock;private: // Operations that will eventually be done only // via lock types void do_write_lock(); void do_read_lock(); void do_write_unlock(); void do_read_unlock(); bool do_try_write_lock(); bool do_try_read_lock(); bool do_timed_write_lock(const xtime &xt); bool do_timed_read_lock(const xtime &xt); void do_demote_to_read_lock(); bool do_try_demote_to_read_lock(); bool do_timed_demote_to_read_lock(const xtime &xt); void do_promote_to_write_lock(); bool do_try_promote_to_write_lock(); bool do_timed_promote_to_write_lock(const xtime &xt); bool locked(); read_write_lock_state::read_write_lock_state_enum state(); detail::thread::read_write_mutex_impl<timed_mutex> m_impl; };} // namespace boost#endif// Change Log:// 10 Mar 02 // Original version.// 4 May 04 GlassfordM// Implement lock promotion and demotion.// Add locked() and state() member functions for debugging// (should these be made public?).// Rename to improve consistency and eliminate abbreviations:// Use "read" and "write" instead of "shared" and "exclusive".// Change "rd" to "read", "wr" to "write", "rw" to "read_write".// Add mutex_type typdef.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?