syncthrd.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:9k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * syncthrd.h
  3.  *
  4.  * Various thread synchronisation classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: syncthrd.h,v $
  30.  * Revision 1.6  1999/03/09 02:59:51  robertj
  31.  * Changed comments to doc++ compatible documentation.
  32.  *
  33.  * Revision 1.5  1999/02/16 08:11:17  robertj
  34.  * MSVC 6.0 compatibility changes.
  35.  *
  36.  * Revision 1.4  1998/11/30 02:52:01  robertj
  37.  * New directory structure
  38.  *
  39.  * Revision 1.3  1998/10/31 12:46:45  robertj
  40.  * Renamed file for having general thread synchronisation objects.
  41.  * Added conditional mutex and read/write mutex thread synchronisation objects.
  42.  *
  43.  * Revision 1.2  1998/09/23 06:21:35  robertj
  44.  * Added open source copyright license.
  45.  *
  46.  * Revision 1.1  1998/05/30 13:26:15  robertj
  47.  * Initial revision
  48.  *
  49.  */
  50. #define _PSYNCPOINTACK
  51. #ifdef __GNUC__
  52. #pragma interface
  53. #endif
  54. #include <ptlib/mutex.h>
  55. #include <ptlib/syncpoint.h>
  56. /** This class defines a thread synchonisation object.
  57.    This may be used to send signals to a thread and await an acknowldegement
  58.    that the signal was processed. This can be be used to initate an action in
  59.    another thread and wait for the action to be completed.
  60. begin{verbatim}
  61.     ... thread one
  62.     while (condition) {
  63.       sync.Wait();
  64.       do_something();
  65.       sync.Acknowledge();
  66.     }
  67.     ... thread 2
  68.     do_something_else();
  69.     sync.Signal();    // At this point thread 1 wake up and does something.
  70.     do_yet_more();    // However, this does not get done until Acknowldege()
  71.                       // is called in the other thread.
  72. end{verbatim}
  73.  */
  74. class PSyncPointAck : public PSyncPoint
  75. {
  76.   PCLASSINFO(PSyncPointAck, PSyncPoint);
  77.   public:
  78.     /** If there are waiting (blocked) threads then unblock the first one that
  79.        was blocked. If no waiting threads and the count is less than the
  80.        maximum then increment the semaphore.
  81.        Unlike the PSyncPoint::Signal() this function will block until the
  82.        target thread that was blocked by the Wait() function has resumed
  83.        execution and called the Acknowledge() function.
  84.        The #waitTime# parameter is used as a maximum amount of time
  85.        to wait for the achnowledgement to be returned from the other thread.
  86.      */
  87.     virtual void Signal();
  88.     void Signal(const PTimeInterval & waitTime);
  89.     /** This indicates that the thread that was blocked in a Wait() on this
  90.        synchonrisation object has completed the operation the signal was
  91.        intended to initiate. This unblocks the thread that had called the
  92.        Signal() function to initiate the action.
  93.      */
  94.     void Acknowledge();
  95.   protected:
  96.     PSyncPoint ack;
  97. };
  98. /**This class defines a thread synchonisation object.
  99.    This is a special type of mutual exclusion, where a thread wishes to get
  100.    exlusive use of a resource but only if a certain other condition is met.
  101.  */
  102. class PCondMutex : public PMutex
  103. {
  104.   PCLASSINFO(PCondMutex, PMutex);
  105.   public:
  106.     /** This function attempts to acquire the mutex, but will block not only
  107.        until the mutex is free, but also that the condition returned by the
  108.        Condition() function is also met.
  109.      */
  110.     virtual void WaitCondition();
  111.     /** If there are waiting (blocked) threads then unblock the first one that
  112.        was blocked. If no waiting threads and the count is less than the
  113.        maximum then increment the semaphore.
  114.      */
  115.     virtual void Signal();
  116.     /** This is the condition that must be met for the WaitCondition() function
  117.        to acquire the mutex.
  118.      */
  119.     virtual BOOL Condition() = 0;
  120.     /** This function is called immediately before blocking on the condition in
  121.        the WaitCondition() function. This could get called multiple times
  122.        before the condition is met and the WaitCondition() function returns.
  123.      */
  124.     virtual void OnWait();
  125.   protected:
  126.     PSyncPoint syncPoint;
  127. };
  128. /** This is a PCondMutex for which the conditional is the value of an integer.
  129.  */
  130. class PIntCondMutex : public PCondMutex
  131. {
  132.   PCLASSINFO(PIntCondMutex, PCondMutex);
  133.   public:
  134.   /**@name Construction */
  135.   //@{
  136.     /// defines possible operators on current value and target value
  137.     enum Operation {
  138.       /// Less than
  139.       LT,
  140.       /// Less than or equal to
  141.       LE,
  142.       /// Equal to
  143.       EQ,
  144.       /// Greater than or equal to
  145.       GE,
  146.       /// Greater than
  147.       GT
  148.     };
  149.     /**
  150.       Create a cond mutex using an integer
  151.     */
  152.     PIntCondMutex(
  153.       int value = 0,            /// initial value if the integer
  154.       int target = 0,           /// target vaue which causes the mutex to unlock
  155.       Operation operation = LE  /// comparison operator
  156.     );
  157.   //@}
  158.   /**@name Overrides from class PObject */
  159.   //@{
  160.     /** Print the object on the stream. This will be of the form
  161.        #"(value < target)"#.
  162.      */
  163.     void PrintOn(ostream & strm) const;
  164.   //@}
  165.   /**@name Condition access functions */
  166.   //@{
  167.     /** This is the condition that must be met for the WaitCondition() function
  168.        to acquire the mutex.
  169.        @return TRUE if condition is met.
  170.      */
  171.     virtual BOOL Condition();
  172.     /**Get the current value of the condition variable.
  173.       @return Current condition variable value.
  174.      */
  175.     operator int() const { return value; }
  176.     /**Assign new condition value.
  177.        Use the Wait() function to acquire the mutex, modify the value, then
  178.        release the mutex, possibly releasing the thread in the WaitCondition()
  179.        function if the condition was met by the operation.
  180.        @return The object reference for consecutive operations in the same statement.
  181.      */
  182.     PIntCondMutex & operator=(int newval);
  183.     /**Increment condition value.
  184.        Use the Wait() function to acquire the mutex, modify the value, then
  185.        release the mutex, possibly releasing the thread in the WaitCondition()
  186.        function if the condition was met by the operation.
  187.        @return The object reference for consecutive operations in the same statement.
  188.      */
  189.     PIntCondMutex & operator++();
  190.     /**Add to condition value.
  191.        Use the Wait() function to acquire the mutex, modify the value, then
  192.        release the mutex, possibly releasing the thread in the WaitCondition()
  193.        function if the condition was met by the operation.
  194.        @return The object reference for consecutive operations in the same statement.
  195.      */
  196.     PIntCondMutex & operator+=(int inc);
  197.     /**Decrement condition value.
  198.        Use the Wait() function to acquire the mutex, modify the value, then
  199.        release the mutex, possibly releasing the thread in the WaitCondition()
  200.        function if the condition was met by the operation.
  201.        @return The object reference for consecutive operations in the same statement.
  202.      */
  203.     PIntCondMutex & operator--();
  204.     /**Subtract from condition value.
  205.        Use the Wait() function to acquire the mutex, modify the value, then
  206.        release the mutex, possibly releasing the thread in the WaitCondition()
  207.        function if the condition was met by the operation.
  208.        @return The object reference for consecutive operations in the same statement.
  209.      */
  210.     PIntCondMutex & operator-=(int dec);
  211.   //@}
  212.   protected:
  213.     int value, target;
  214.     Operation operation;
  215. };
  216. /** This class defines a thread synchonisation object.
  217.    This is a special type of mutual exclusion, where the excluded area may
  218.    have multiple read threads but only one write thread and the read threads
  219.    are blocked on write as well.
  220.  */
  221. class PReadWriteMutex : public PObject
  222. {
  223.   PCLASSINFO(PReadWriteMutex, PObject);
  224.   public:
  225.     /** This function attempts to acquire the mutex for reading.
  226.      */
  227.     void StartRead();
  228.     /** This function attempts to release the mutex for reading.
  229.      */
  230.     void EndRead();
  231.     /** This function attempts to acquire the mutex for writing.
  232.      */
  233.     void StartWrite();
  234.     /** This function attempts to release the mutex for writing.
  235.      */
  236.     void EndWrite();
  237.   protected:
  238.     PMutex starvationPreventer;
  239.     PIntCondMutex readers;
  240. };
  241. ////////////////////////////////////////////////////////////////////////////////