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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __THREADS_COND_H
  2. #define __THREADS_COND_H
  3. #include <thread_mutex.h>
  4. #include <thread_attributes.h>
  5. #include <thread_spinlock.h>
  6. class wait_queue;
  7. /**
  8.  * Cond, is a conditional semaphore.  A process can wait on a
  9.  * specific condition... and another, can trigger that condition
  10.  * through this class.
  11.  *
  12.  * One typical example of use of this kind of class, is the
  13.  * producer consumer example:
  14.  *
  15.  * <pre>
  16.  *
  17.  * #include <thread.h>
  18.  * #include <string>
  19.  *
  20.  * string produced;
  21.  * mutex lock;
  22.  * cond signal;
  23.  *
  24.  * class producer : public pthread {
  25.  *  public:
  26.  *    producer() { };
  27.  *    ~producer() { };
  28.  *    int thread(void *) {
  29.  *       char buf[80];
  30.  *
  31.  *       lock.lock();
  32.  *       cin.geline(buf,80);
  33.  *       produced = buf;
  34.  *       signal.signal();
  35.  *       lock.unlock();
  36.  *    };
  37.  * };
  38.  *
  39.  * class consumer : public pthread {
  40.  *  public:
  41.  *    consumer() { };
  42.  *    ~consumer() { };
  43.  *
  44.  *    int thread(void *) {
  45.  *       lock.lock();
  46.  *       signal.wait();
  47.  *       cout << "Production was '" << s.c_str() << "'n";
  48.  *       lock.unlock();
  49.  *    }
  50.  * }
  51.  *
  52.  * main()
  53.  * {
  54.  *   pthread = p;
  55.  * 
  56.  *   p new consumer;
  57.  *   (void)new producer;
  58.  *   p.join();
  59.  * }
  60.  *
  61.  * </pre>
  62.  *
  63.  * Notice the order, in which the two threads are created.  The consumer
  64.  * before the producer.  This is because both of these threads start by
  65.  * locking the mutex lock, and the consumer must be the first one to
  66.  * actually acquire it.
  67.  * 
  68.  * @short Class for signalling conditions between processes.
  69.  * @author Orn Hansen <oe.hansen@gamma.telenordia.se>
  70.  */
  71. class cond {
  72.  private:
  73.   static char *c_project;
  74.   int c_id;
  75.   attributes::scope c_scope;
  76.   wait_queue *c_waiting;
  77.  public:
  78.   cond(attributes::scope);
  79.   cond();
  80.   ~cond();
  81.   /**
  82.    * Each condition variable, can have one of the
  83.    * following scopes.
  84.    *
  85.    * <pre>
  86.    * process_shared     - interprocess
  87.    * process_private    - only within this process and its threads.
  88.    * </pre>
  89.    *
  90.    * @return The scope of this condition variable.
  91.    */
  92.   attributes::scope scope();
  93.   /**
  94.    * This method, waits until a signal has been received
  95.    * and suspends the calling process during that period.  The
  96.    * thread can be cancelled, while waiting for the signal.
  97.    *
  98.    * @param mutex A mutex variable, which is unlocked during the period and locked immediately after.
  99.    * @return Always returns 0, signifying success.
  100.    */
  101.   int wait(mutex&);
  102.   /**
  103.    * This method, acts in a similar manner to the one above,
  104.    * but it will timeout on the wait when a specific time tick
  105.    * has been reached. Take a look at @ref #timedwait_rel 
  106.    * for a discussion on possible return values.
  107.    * @see #timedwait_rel for a discussion on the kinds
  108.    * of return values that are available.
  109.    *
  110.    * @param mutex Mutex variable to lock on signal.
  111.    * @param timespec The time tick, when a timeout should occur.
  112.    */
  113.   int timedwait(mutex&, const struct timespec *);
  114.   /**
  115.    * This method is equivalent to the above, except that the
  116.    * time specification it accepts is a relative time.  Instead
  117.    * of specifying the absolute time tick to timeout, it specifies
  118.    * the amount of time to wait, until a timeout should occurr.
  119.    * This method will return a value, specifying the cause of
  120.    * return from it.  It can be one of:
  121.    * <pre>
  122.    *   ESRCH          - If the calling thread is not known to the system.
  123.    *   EINTR          - If an interrupt signal was received and terminated the wait.
  124.    *   ETIMEOUT       - If a timeout occurred, prior to receiving a signal.
  125.    *   0              - On success.
  126.    * </pre>
  127.    *
  128.    * @param mutex The mutex to lock, when signal has been received.
  129.    * @param timespec A structure with the amount of time to wait for a signal, before timing out.
  130.    */
  131.   int timedwait_rel(mutex&, const struct timespec *);
  132.   /**
  133.    * This method, will send a signal to the next process that is
  134.    * registered in the waiting processes list.  That process will
  135.    * be revived.
  136.    *
  137.    * @return Always return 0, signifying success.
  138.    */
  139.   int signal();
  140.   /**
  141.    * This method, will send a signal to every process on the waiting
  142.    * processes list, reviving them all.  All processes will be removed
  143.    * from the waiting queue.
  144.    *
  145.    * @return Always return 0, signifying success.
  146.    */
  147.   int broadcast();
  148.   /**
  149.    * The shared memory scheme, wants a single name to identify the
  150.    * overall program.  It is possible, and perhaps desired that
  151.    * part cond/mutex/semaphore have their own name identification
  152.    * tree.  This is possible, by stating that it should be branch
  153.    * of the main file name, with a give extension.
  154.    *
  155.    * <pre>
  156.    * main()
  157.    * {
  158.    *   cond *cv;
  159.    *
  160.    *   pthread::set_project( "my_project" );
  161.    *   cond::project_par( "cond" );
  162.    *   cv = new cond(attributes::process_shared);
  163.    *   ...
  164.    * }
  165.    * </pre>
  166.    *
  167.    * This will set the project to my_project, and all condition
  168.    * variables will be derived from my_project_cond.
  169.    *
  170.    * @param part A C string containing the cond part name.
  171.    */
  172.   static void project_part(const char *);
  173. };
  174. #endif /* THREADS COND */