dining.c

来自「C++ SOCKET 类」· C语言 代码 · 共 83 行

C
83
字号
#include <thread.h>#include "philosopher.h"#include "dining.h"using namespace cpp_threads;dining::dining(int p_no){  p_fork = new Mutex[p_no];  p      = (Pthread **)malloc(sizeof(Pthread*)*(p_no+1));  for( philosophers=0;philosophers<p_no;philosophers++ )    p[philosophers] = new philosopher(philosophers,p_no,this);}dining::~dining(){  int n = 0;   // house keeping.  for( n=0;n<philosophers;n++ )    delete (p[n]);  delete p;  delete[] p_fork;  cout << "Diner closing." << endl;}int dining::nr(){  return philosophers;}bool dining::isLocked(int p_no){  bool locked;  if (locked = (p_fork[p_no].tryLock() == 0))    p_fork[p_no].unLock();  return !locked;}void dining::finished(int){  p_finish.post();}void dining::open(){  int n = 0;  for( n=0;n<philosophers;n++ )    ((philosopher *)p[n])->run();  for(n=0;n<philosophers;n++) {    p_finish.wait();    cout << philosophers - n -1 << " little indians, hanging on the wall" << endl;  }}bool dining::get_forks(int p_nr){  int lfork,rfork;  lfork = p_nr-1 >= 0 ? p_nr-1 : nr()-1;  rfork = lfork+1 >= nr() ? 0 : lfork+1;  if ( p_fork[lfork].tryLock() == 0 )    if ( p_fork[rfork].tryLock() == 0 )      return true;    else      p_fork[lfork].unLock();  return false;}void dining::put_forks(int p_nr){  int lfork,rfork;  lfork = p_nr-1 >= 0 ? p_nr-1 : nr()-1;  rfork = lfork+1 >= nr() ? 0 : lfork+1;  p_fork[lfork].unLock();  p_fork[rfork].unLock();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?