static_mutex.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 180 行

CPP
180
字号
/* * * Copyright (c) 2004 * John Maddock * * Use, modification and distribution are subject to 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) * */  /*  *   LOCATION:    see http://www.boost.org for most recent version.  *   FILE         static_mutex.cpp  *   VERSION      see <boost/version.hpp>  *   DESCRIPTION: Declares static_mutex lock type.  */#define BOOST_REGEX_SOURCE#include <boost/config.hpp>#ifdef BOOST_HAS_THREADS#include <boost/regex/pending/static_mutex.hpp>#if defined(BOOST_HAS_WINTHREADS)#ifndef NOMINMAX#  define NOMINMAX#endif#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <boost/static_assert.hpp>#endifnamespace boost{#if defined(BOOST_HAS_PTHREADS) && defined(PTHREAD_MUTEX_INITIALIZER)scoped_static_mutex_lock::scoped_static_mutex_lock(static_mutex& m, bool lk): m_mutex(m), m_have_lock(false){   if(lk)      lock();}scoped_static_mutex_lock::~scoped_static_mutex_lock(){   if(m_have_lock)      unlock();}void scoped_static_mutex_lock::lock(){   if(0 == m_have_lock)   {      pthread_mutex_lock(&(m_mutex.m_mutex));      m_have_lock = true;   }}void scoped_static_mutex_lock::unlock(){   if(m_have_lock)   {      pthread_mutex_unlock(&(m_mutex.m_mutex));      m_have_lock = false;   }}#elif defined(BOOST_HAS_WINTHREADS)BOOST_STATIC_ASSERT(sizeof(LONG) == sizeof(boost::int32_t));scoped_static_mutex_lock::scoped_static_mutex_lock(static_mutex& m, bool lk): m_mutex(m), m_have_lock(false){   if(lk)      lock();}scoped_static_mutex_lock::~scoped_static_mutex_lock(){   if(m_have_lock)      unlock();}void scoped_static_mutex_lock::lock(){   if(0 == m_have_lock)   {#if !defined(InterlockedCompareExchangePointer)      while(0 != InterlockedCompareExchange(reinterpret_cast<void**>((boost::uint_least16_t*)&(m_mutex.m_mutex)), (void*)1, 0))#else      while(0 != InterlockedCompareExchange(reinterpret_cast<LONG*>(&(m_mutex.m_mutex)), 1, 0))#endif      {         Sleep(0);      }      m_have_lock = true;   }}void scoped_static_mutex_lock::unlock(){   if(m_have_lock)   {#if !defined(InterlockedCompareExchangePointer)      InterlockedExchange((LONG*)&(m_mutex.m_mutex), 0);#else      InterlockedExchange(reinterpret_cast<LONG*>(&(m_mutex.m_mutex)), 0);#endif      m_have_lock = false;   }}#else//// Portable version of a static mutex based on Boost.Thread library://#include <stdlib.h>#include <boost/assert.hpp>boost::recursive_mutex* static_mutex::m_pmutex = 0;boost::once_flag static_mutex::m_once = BOOST_ONCE_INIT;extern "C" BOOST_REGEX_DECL void free_static_mutex(){   delete static_mutex::m_pmutex;   static_mutex::m_pmutex = 0;}void static_mutex::init(){   m_pmutex = new boost::recursive_mutex();   int r = atexit(free_static_mutex);   BOOST_ASSERT(0 == r);}scoped_static_mutex_lock::scoped_static_mutex_lock(static_mutex& , bool lk): m_plock(0), m_have_lock(false){   if(lk)      lock();}scoped_static_mutex_lock::~scoped_static_mutex_lock(){   if(m_have_lock)      unlock();   delete m_plock;}void scoped_static_mutex_lock::lock(){   if(0 == m_have_lock)   {       boost::call_once(static_mutex::m_once,&static_mutex::init);      if(0 == m_plock)         m_plock = new boost::recursive_mutex::scoped_lock(*static_mutex::m_pmutex, false);      m_plock->lock();      m_have_lock = true;   }}void scoped_static_mutex_lock::unlock(){   if(m_have_lock)   {      m_plock->unlock();      m_have_lock = false;   }}#endif}#endif // BOOST_HAS_THREADS

⌨️ 快捷键说明

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