?? dining.c
字號:
#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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -