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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __THREADS_SEMAPHORE_H
  2. #define __THREADS_SEMAPHORE_H
  3. #include <thread_attributes.h>
  4. #include <thread_spinlock.h>
  5. class wait_queue;
  6. /**
  7.  * A semaphore, it functions in much a similar way as a mutex
  8.  * does, but with some exceptions.
  9.  *
  10.  * @author Orn E. Hansen <oe.hansen@gamma.telenordia.se>
  11.  * @short Implements a semaphore, for thread synchronisation.
  12.  */
  13. class semaphore {
  14.  protected:
  15.   static char *s_project;
  16.   int s_id;
  17.   wait_queue *s_waiting;
  18.   attributes::scope s_scope;
  19.   struct storage {
  20.     int s_magic;
  21.     spinlock s_sync;
  22.     int s_count;
  23.   } *_s;
  24.  public:
  25.   semaphore(attributes::scope);
  26.   semaphore(attributes::scope, int);
  27.   semaphore();
  28.   semaphore(int);
  29.   ~semaphore();
  30.   /**
  31.    * Increment the semaphore count, the top most blocking thread on
  32.    * the waiting list is restarted.
  33.    *
  34.    * @return The updated value, of the semaphore count.
  35.    */
  36.   int post();
  37.   /**
  38.    * Block the calling process, until the semaphore count becomes
  39.    * greater than 1, then atomically decrement it.
  40.    * 
  41.    * @return The current count of the semaphore.
  42.    */
  43.   int wait();
  44.   /**
  45.    * Decrement the count, if it is greater than zero.  This is a
  46.    * non-blocking call.
  47.    *
  48.    * @return The count of the semaphore after decrement, or -1 not.
  49.    */
  50.   int trywait();
  51.   /**
  52.    * The shared memory scheme, wants a single name to identify the
  53.    * overall program.  It is possible, and perhaps desired that
  54.    * part cond/mutex/semaphore have their own name identification
  55.    * tree.  This is possible, by stating that it should be branch
  56.    * of the main file name, with a give extension.
  57.    *
  58.    * <pre>
  59.    * main()
  60.    * {
  61.    *   semaphore *sv;
  62.    *
  63.    *   pthread::set_project( "my_project" );
  64.    *   semaphore::project_par( "sem" );
  65.    *   sv = new semaphore(attributes::process_shared);
  66.    *   ...
  67.    * }
  68.    * </pre>
  69.    *
  70.    * This will set the project to my_project, and all semaphores
  71.    * will be derived from my_project_sem.
  72.    *
  73.    * @param part A C string containing the semaphore part name.
  74.    */
  75.   static void project_part(const char *);
  76. };
  77. #endif /* __THREADS_SEMAPHORE_H */