⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 critsec.h

📁 pwlib源码库
💻 H
字号:
/* * critsec.h * * Critical section mutex class. * * Portable Windows Library * * Copyright (C) 2004 Post Increment * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Post Increment * * Contributor(s): ______________________________________. * * $Log: critsec.h,v $ * Revision 1.9  2004/05/16 23:31:07  csoutheren * Updated API documentation * * Revision 1.8  2004/05/12 04:36:13  csoutheren * Fixed problems with using sem_wait and friends on systems that do not * support atomic integers * * Revision 1.7  2004/04/21 11:22:56  csoutheren * Modified to work with gcc 3.4.0 * * Revision 1.6  2004/04/14 06:58:00  csoutheren * Fixed PAtomicInteger and PSmartPointer to use real atomic operations * * Revision 1.5  2004/04/12 03:35:26  csoutheren * Fixed problems with non-recursuve mutexes and critical sections on * older compilers and libc * * Revision 1.4  2004/04/12 00:58:45  csoutheren * Fixed PAtomicInteger on Linux, and modified PMutex to use it * * Revision 1.3  2004/04/12 00:36:04  csoutheren * Added new class PAtomicInteger and added Windows implementation * * Revision 1.2  2004/04/11 03:20:41  csoutheren * Added Unix implementation of PCriticalSection * * Revision 1.1  2004/04/11 02:55:17  csoutheren * Added PCriticalSection for Windows * Added compile time option for PContainer to use critical sections to provide thread safety under some circumstances * */#ifndef _PCRITICALSECTION#define _PCRITICALSECTION#if P_HAS_ATOMIC_INT#if P_NEEDS_GNU_CXX_NAMESPACE#define	EXCHANGE_AND_ADD(v,i)	__gnu_cxx::__exchange_and_add(v,i)#else#define	EXCHANGE_AND_ADD(v,i)	__exchange_and_add(v,i)#endif#endif/** This class implements critical section mutexes using the most  * efficient mechanism available on the host platform.  * For Windows, CriticalSection is used.  * On other platforms, the sem_wait call is used.  */class PCriticalSection : public PObject{  PCLASSINFO(PCriticalSection, PObject);  public:  /**@name Construction */  //@{    /**Create a new critical section object .     */    PINLINE PCriticalSection();    /**Destroy the critical section object     */    PINLINE ~PCriticalSection();  //@}  /**@name Operations */  //@{    /** Enter the critical section by waiting for exclusive access.     */    PINLINE void Enter();    /** Leave the critical section by unlocking the mutex     */    PINLINE void Leave();  //@}  private:    PCriticalSection & operator=(const PCriticalSection &) { return *this; }// Include platform dependent part of class#ifdef _WIN32#include "msos/ptlib/critsec.h"#else#include "unix/ptlib/critsec.h"#endif};class PEnterAndLeave {  public:    /**Create the critical section enter and leave instance.       This will enter the critical section using the #Enter()# function       before returning.      */    inline PEnterAndLeave(      PCriticalSection & _critSec,   /// CriticalSection descendent to enter/leave.      BOOL enter = TRUE                   /// Enter before returning.    )    : critSec(_critSec)    { if (enter) critSec.Enter(); }    /** Leave the critical section.        This will execute the Leave() function on the critical section that was used        in the construction of this instance.     */    inline ~PEnterAndLeave()    { critSec.Leave(); }  protected:    PCriticalSection & critSec;};/** This class implements an integer that can be atomically   * incremented and decremented in a thread-safe manner.  * On Windows, the integer is of type long and this class is implemented using InterlockedIncrement  * and InterlockedDecrement integer is of type long.  * On Unix systems with GNU std++ support for EXCHANGE_AND_ADD, the integer is of type _Atomic_word (normally int)  * On all other systems, this class is implemented using PCriticalSection and the integer is of type int.  */class PAtomicInteger {#if defined(_WIN32) || defined(DOC_PLUS_PLUS)    public:      /** Create a PAtomicInteger with the specified initial value        */      inline PAtomicInteger(long v = 0)        : value(v) { }      /**        * Test if an atomic integer has a zero value. Note that this        * is a non-atomic test - use the return value of the operator++() or        * operator--() tests to perform atomic operations        *        * @return TRUE if the integer has a value of zero        */      BOOL IsZero() const                 { return value == 0; }      /**        * atomically increment the integer value        *        * @return Returns the value of the integer after the increment        */      inline long operator++()            { return InterlockedIncrement(&value); }      /**        * atomically decrement the integer value        *        * @return Returns the value of the integer after the decrement        */      inline long operator--()            { return InterlockedDecrement(&value); }      /**        * @return Returns the value of the integer        */      inline operator long () const       { return value; }      /**        * Set the value of the integer        */      inline void SetValue(long v)        { value = v; }    protected:      long value;#elif P_HAS_ATOMIC_INT    public:      inline PAtomicInteger(int v = 0)        : value(v) { }      BOOL IsZero() const                { return value == 0; }      inline int operator++()            { return EXCHANGE_AND_ADD(&value, 1) + 1; }      inline int unsigned operator--()   { return EXCHANGE_AND_ADD(&value, -1) - 1; }      inline operator int () const       { return value; }      inline void SetValue(int v)        { value = v; }    protected:      _Atomic_word value;#else     protected:      PCriticalSection critSec;    public:      inline PAtomicInteger(int v = 0)        : value(v) { }      BOOL IsZero() const                { return value == 0; }      inline int operator++()            { PEnterAndLeave m(critSec); value++; return value;}      inline int operator--()            { PEnterAndLeave m(critSec); value--; return value;}      inline operator int () const       { return value; }      inline void SetValue(int v)        { value = v; }   private:      PAtomicInteger & operator=(const PAtomicInteger & ref) { value = (int)ref; return *this; }    protected:      int value;#endif};#endif// End Of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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