condition.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 199 行

HPP
199
字号
// Copyright (C) 2001-2003// 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.  William E. Kempf makes no representations// about the suitability of this software for any purpose.// It is provided "as is" without express or implied warranty.#ifndef BOOST_CONDITION_WEK070601_HPP#define BOOST_CONDITION_WEK070601_HPP#include <boost/thread/detail/config.hpp>#include <boost/thread/exceptions.hpp>#include <boost/utility.hpp>#include <boost/thread/detail/lock.hpp>#if defined(BOOST_HAS_PTHREADS)#   include <pthread.h>#elif defined(BOOST_HAS_MPTASKS)#   include "scoped_critical_region.hpp"#endifnamespace boost {struct xtime;namespace detail {class BOOST_THREAD_DECL condition_impl : private noncopyable{    friend class condition;public:    condition_impl();    ~condition_impl();    void notify_one();    void notify_all();#if (defined(BOOST_HAS_WINTHREADS) || defined(BOOST_HAS_MPTASKS))    void enter_wait();    void do_wait();    bool do_timed_wait(const xtime& xt);#elif defined(BOOST_HAS_PTHREADS)    void do_wait(pthread_mutex_t* pmutex);    bool do_timed_wait(const xtime& xt, pthread_mutex_t* pmutex);#endif#if defined(BOOST_HAS_WINTHREADS)    void* m_gate;    void* m_queue;    void* m_mutex;    unsigned m_gone;  // # threads that timed out and never made it to m_queue    unsigned long m_blocked; // # threads blocked on the condition    unsigned m_waiting; // # threads no longer waiting for the condition but                        // still waiting to be removed from m_queue#elif defined(BOOST_HAS_PTHREADS)    pthread_cond_t m_condition;#elif defined(BOOST_HAS_MPTASKS)    MPSemaphoreID m_gate;    MPSemaphoreID m_queue;    threads::mac::detail::scoped_critical_region m_mutex;    threads::mac::detail::scoped_critical_region m_mutex_mutex;    unsigned m_gone; // # threads that timed out and never made it to m_queue    unsigned long m_blocked; // # threads blocked on the condition    unsigned m_waiting; // # threads no longer waiting for the condition but                        // still waiting to be removed from m_queue#endif};} // namespace detailclass condition : private noncopyable{public:    condition() { }    ~condition() { }    void notify_one() { m_impl.notify_one(); }    void notify_all() { m_impl.notify_all(); }    template <typename L>    void wait(L& lock)    {        if (!lock)            throw lock_error();        do_wait(lock.m_mutex);    }    template <typename L, typename Pr>    void wait(L& lock, Pr pred)    {        if (!lock)            throw lock_error();        while (!pred())            do_wait(lock.m_mutex);    }    template <typename L>    bool timed_wait(L& lock, const xtime& xt)    {        if (!lock)            throw lock_error();        return do_timed_wait(lock.m_mutex, xt);    }    template <typename L, typename Pr>    bool timed_wait(L& lock, const xtime& xt, Pr pred)    {        if (!lock)            throw lock_error();        while (!pred())        {            if (!do_timed_wait(lock.m_mutex, xt))                return false;        }        return true;    }private:    detail::condition_impl m_impl;    template <typename M>    void do_wait(M& mutex)    {#if (defined(BOOST_HAS_WINTHREADS) || defined(BOOST_HAS_MPTASKS))        m_impl.enter_wait();#endif        typedef detail::thread::lock_ops<M>#if defined(__HP_aCC) && __HP_aCC <= 33900 && !defined(BOOST_STRICT_CONFIG)# define lock_ops lock_ops_  // HP confuses lock_ops witht the template#endif            lock_ops;        typename lock_ops::lock_state state;        lock_ops::unlock(mutex, state);#if defined(BOOST_HAS_PTHREADS)        m_impl.do_wait(state.pmutex);#elif (defined(BOOST_HAS_WINTHREADS) || defined(BOOST_HAS_MPTASKS))        m_impl.do_wait();#endif        lock_ops::lock(mutex, state);#undef lock_ops    }    template <typename M>    bool do_timed_wait(M& mutex, const xtime& xt)    {#if (defined(BOOST_HAS_WINTHREADS) || defined(BOOST_HAS_MPTASKS))        m_impl.enter_wait();#endif        typedef detail::thread::lock_ops<M>#if defined(__HP_aCC) && __HP_aCC <= 33900 && !defined(BOOST_STRICT_CONFIG)# define lock_ops lock_ops_  // HP confuses lock_ops witht the template#endif            lock_ops;        typename lock_ops::lock_state state;        lock_ops::unlock(mutex, state);        bool ret = false;#if defined(BOOST_HAS_PTHREADS)        ret = m_impl.do_timed_wait(xt, state.pmutex);#elif (defined(BOOST_HAS_WINTHREADS) || defined(BOOST_HAS_MPTASKS))        ret = m_impl.do_timed_wait(xt);#endif        lock_ops::lock(mutex, state);#undef lock_ops        return ret;    }};} // namespace boost// Change Log://    8 Feb 01  WEKEMPF Initial version.//   22 May 01  WEKEMPF Modified to use xtime for time outs.//   23 May 01  WEKEMPF Removed "duration" timed_waits, as they are too//                      difficult to use with spurious wakeups.//    3 Jan 03  WEKEMPF Modified for DLL implementation.#endif // BOOST_CONDITION_WEK070601_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?