thread_mutex.h
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __THREADS_MUTEX_H
  2. #define __THREADS_MUTEX_H
  3. #include <thread_attributes.h>
  4. #include <thread_spinlock.h>
  5. class wait_queue;
  6. /**
  7.  * Mutex, is a class for mutual exclusion of parallel
  8.  * processes.  That need to access the same memory, while
  9.  * keeping exclusive access.
  10.  *
  11.  * @short Class for mutual exclusion of parallel processes.
  12.  * @author Orn Hansen <oe.hansen@gamma.telenordia.se>
  13.  */
  14. class mutex {
  15.  public:
  16.   enum mutex_kind { 
  17.     fast, 
  18.     recursive, 
  19.     errorcheck 
  20.   };
  21.  private:
  22.   static char *m_project;
  23.   int m_id;
  24.   wait_queue *m_waiting;
  25.   attributes::scope m_scope;
  26.   struct storage {
  27.     int m_magic;
  28.     spinlock m_spinlock;
  29.     int m_count;
  30.     int m_owner;
  31.     mutex_kind m_kind;
  32.   } *_m;
  33.   void release();
  34.   int acquire();
  35.   void init(attributes::scope);
  36.  public:
  37.   mutex(attributes::scope);
  38.   mutex();
  39.   ~mutex();
  40.   /**
  41.    * Each mutex variable, can exist within a single process
  42.    * hierarchy or be viewed system wide.  The range of the
  43.    * scope is:
  44.    *
  45.    * <pre>
  46.    * process_shared     - interprocess
  47.    * process_private    - only within this process and its threads.
  48.    * </pre>
  49.    *
  50.    * @return The scope of this mutex.
  51.    */
  52.   attributes::scope scope();
  53.   /**
  54.    * Try and lock the mutex, and return immediately to the
  55.    * caller with the result.
  56.    *
  57.    * @return EBUSY if the mutex is busy, EINVAL if it is an unknown kind and 0 on success.
  58.    */
  59.   int trylock();
  60.   /**
  61.    * Lock the mutex, and wait for ut if it is already
  62.    * locked by another.  This will suspend the calling process
  63.    * until such time the lock is successful, or an error occurs.
  64.    *
  65.    * @return 0 on success, EINVAL if the mutex is an unknown kind.
  66.    */
  67.   int lock();
  68.   /**
  69.    * Unlock a previously locked mutex, and restart any threads that
  70.    * are waiting on this mutex.
  71.    *
  72.    * @return 0 on success, EBUSY if it is locked by another process, and EINVAL if the mutex is an unknown kind.
  73.    */
  74.   int unlock();
  75.   /**
  76.    * The following methods allow the specification of different mutex
  77.    * variable kinds.  The differences are in how they are treated, not
  78.    * in how they function. See the next method, for a discussion on
  79.    * mutex kinds.
  80.    *
  81.    * @return fast for a fast mutex, and recursive for a mutex that can be locked several times by it's owner.
  82.    */
  83.   int kind();
  84.   /**
  85.    * This method, sets the mutex kind and returns the old value.  The
  86.    * valid mutex kinds are:
  87.    *
  88.    * <pre>
  89.    * mutex_kind::fast       - can only be locked once, by any process.
  90.    * mutex_kind::recursive  - can be locked multiple times, by the owner. of
  91.    *                          the original lock.  it must be unlocked equally
  92.    *                          many times.
  93.    * mutex_kind::errorcheck - this is a fast mutex, but with simple checks
  94.    *                          that will enable the user to detect possible
  95.    *                          dedlocks.
  96.    * </pre>
  97.    *
  98.    * @param kind The mutex kind, see above.
  99.    * @return the previous kind, prior to setting.
  100.    */
  101.   int kind(mutex_kind);
  102.   /**
  103.    * The shared memory scheme, wants a single name to identify the
  104.    * overall program.  It is possible, and perhaps desired that
  105.    * part cond/mutex/semaphore have their own name identification
  106.    * tree.  This is possible, by stating that it should be branch
  107.    * of the main file name, with a give extension.
  108.    *
  109.    * <pre>
  110.    * main()
  111.    * {
  112.    *   mutex *ml;
  113.    *
  114.    *   pthread::set_project( "my_project" );
  115.    *   mutex::project_par( "mutex" );
  116.    *   ml = new mutex(attributes::process_shared);
  117.    *   ...
  118.    * }
  119.    * </pre>
  120.    *
  121.    * This will set the project to my_project, and all mutexes
  122.    * will be derived from my_project_mutex.
  123.    *
  124.    * @param part A C string containing the mutex part name.
  125.    */
  126.   static void project_part(const char *);
  127. };
  128. #endif /* THREADS MUTEX */