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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #include "philosopher.h"
  2. philosopher::philosopher(int n, int forks, void *arg)
  3.   : pthread(arg)
  4. {
  5.   _nr = n;
  6.   _forks = forks;
  7.   _count = forks;
  8. }
  9. philosopher::~philosopher()
  10. {
  11.   delete p_fork;
  12. }
  13. int philosopher::thread(void *ptr)
  14. {
  15.   bool fork_v = false;
  16.   int lfork, rfork;
  17.   
  18.   application = (dining *)ptr;
  19.   lfork = _nr-1 >= 0 ? _nr-1 : _forks-1;
  20.   rfork = lfork+1 >= _forks ? 0 : lfork+1;
  21.   while(_count-- > 0) {
  22.     cout.form("Philosopher %d: looking for %d,%dn", _nr, lfork, rfork);
  23.     while( fork_v == false ) {
  24.       if (application->fork(lfork).trylock() == 0) {
  25. if (application->fork(rfork).trylock() == 0)
  26.   fork_v = true;
  27. else
  28.   application->fork(lfork).unlock();
  29.       }
  30.     }
  31.     cout.form("Philosopher %d: using (%d,%d).n", _nr, lfork, rfork);
  32.     sleep(2);
  33.     fork_v = false;
  34.     cout.form("Philosopher %d: sleepingn", _nr);
  35.     application->fork(lfork).unlock();
  36.     application->fork(rfork).unlock();
  37.     sleep(2);
  38.   }
  39.   application->finished();
  40.   cout << _nr << " has finished dining." << endl;
  41.   return 0;
  42. }