shadanji
全部博文(40)
Python(6)
C/C++(0)
K&R2(4)
C语言程序(0)
边角旮旯(1)
厨艺(0)
操作系统设计与实(6)
2011年(8)
2010年(32)
get109en
Angel_Si
jackyguo
lidanyan
xiaobaih
ChangeFu
bclzvs
heart201
xtwyp
分类:
2010-05-13 16:13:06
#define N 5 /*哲学家数目*/ #define LEFT (i+N-1)%N /*i的左边号码*/ #define RIGHT (i+1)%N /*i的右边号码*/ #define THINKING 0 /*哲学家正在思考*/ #define HUNGRY 1 /*哲学家想取得叉子*/ #define EATING 2 /*哲学家在进餐*/ typedef int semaphore; /*信号量是一个特殊的整型变量*/ int state[N]; /*哲学家的状态*/ semaphore mutex = 1; /*临界区互斥*/ semaphore s[N]; /*每个哲学家一个信号量*/ void philosopher(int i) { while (TRUE) { think(); take_forks(i); /*需要两把叉子,或者阻塞*/ eat(); put_forks(i); /*放回叉子*/ } } void take_forks(int i) { down(&mutex); /*进入临界区*/ state[i] = HUNGRY; /*修改状态*/ test(i); /*试图得到两把叉子*/ up(&mutex); /*出临界区*/ down(&s[i]); /*如果得不到叉子则阻塞。说明其邻居正在进餐,等待其邻居进餐完毕后 执行test(LEFT)和test(RIGHT)*/ } void put_forks(int i) { down(&mutex); state[i] = THINKING; test(LEFT); test(RIGHT); up(&mutex); } void test(int i) { if (state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) { state[i] = EATING; up(s[i]); } }
typedef int semaphore; semaphore mutex=1; /*互斥对rc的访问*/ semaphore db=1; /*互斥读者和写者对数据库的访问*/ int rc=0; void reader(void){ while(TRUE){ down(&mutex); rc=rc+1; if(rc==1) down(&db); /*如果是第一个读者,则阻塞之后的写者*/ up(&mutex); read_data_base(); down(&mutex); rc=rc-1; if(rc==0) up(&db); /*如果是最后一个读者,解开对写者的互斥*/ up(&mutex); use_data_base(); } } void writer(void){ while(TRUE){ down(&db); /*阻塞读者的访问*/ write_data_base(); up(&db); } }
上一篇:第2章 进程-2
下一篇:第2章 进程-4
登录 注册