共享变量readcount,用于记录当前正在读数据集的读进程数目,初值为0。
读者描述
p(mutex);
if (readcount==0) p(writer);
readcount=readcount+1;
v(mutex);
读数据集;
p(mutex) ;
readcount=readcount-1 ;
if (readcount==0) v(writer);
v(mutex);
写者描述
p(writer);
写数据集;
v(writer);
对读者写者问题的理解
请注意对信号量mutex意义的理解。
mutex是一个互斥信号量,用于使读进程互斥地访问共享变量readcount。该信号量并不表示读进程的数目,表示读进程数目的是共享变量readcount。
3. 哲学家进餐问题
哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,
哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,
平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,
进餐完毕,放下筷子又继续思考。
用信号量解决哲学家进餐问题
用五支筷子的信号量构成信号量数组:
semaphore stick[5] ;
所有信号量初值为1,
笫i个哲学家的活动算法描述
p(stick[i]);
p(stick[(i+1) % 5]);
进餐;
v(stick[i]);
v(stick[(i+1) % 5]);
思考;
算法描述存在的问题
上述算法有可能引起死锁。对于这样的死锁问题有如下办法解决:
至多允许四个哲学家同时进餐。
仅当左、右两支筷子均可用时,才允许拿起筷子进餐。
奇数号哲学家先拿左筷子再拿右筷子,偶数号哲学家相反。