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

Linux/Unix编程

开发平台:

Unix_Linux

  1. //
  2. // This is a philosopher demo, using process scoping.
  3. #include <thread.h>
  4. #define MAX_PHILOSOPHERS          5
  5. int main()
  6. {
  7.   mutex *p_fork;
  8.   semaphore *sem;
  9.   bool fork_v = false;
  10.   int lfork, rfork, _nr, _forks = MAX_PHILOSOPHERS, _count;
  11.   
  12.   pthread::set_project( "/tmp/philosophy" );
  13.   sem    = new semaphore(attributes::process_shared);
  14.   p_fork = new mutex[MAX_PHILOSOPHERS](attributes::process_shared);
  15.   if ( (_nr = sem->post()) > MAX_PHILOSOPHERS ) {
  16.     sem->trywait();
  17.     exit(0);
  18.   }
  19.   _count = _forks;
  20.   _nr -= 1;
  21.   lfork = _nr-1 >= 0 ? _nr-1 : _forks-1;
  22.   rfork = lfork+1 >= _forks ? 0 : lfork+1;
  23.   while(_count-- > 0) {
  24.     cout.form("Philosopher %d: looking for %d,%dn", _nr, lfork, rfork);
  25.     while( fork_v == false ) {
  26.       if (p_fork[lfork].trylock() == 0) {
  27. if (p_fork[rfork].trylock() == 0)
  28.   fork_v = true;
  29. else
  30.   p_fork[lfork].unlock();
  31.       }
  32.     }
  33.     cout.form("Philosopher %d: using (%d,%d).n", _nr, lfork, rfork);
  34.     sleep(2);
  35.     fork_v = false;
  36.     cout.form("Philosopher %d: sleepingn", _nr);
  37.     p_fork[lfork].unlock();
  38.     p_fork[rfork].unlock();
  39.     sleep(2);
  40.   }
  41.   cout << _nr << " has finished dining." << endl;
  42.   sem->trywait();
  43.   return 0;
  44. }