注册 登录
编程论坛 Windows论坛

读者——写着问题(进程管理)

yushui 发布于 2007-04-06 19:57, 849 次点击

该问题中对共享资源的读写操作的限制:
允许任意多的读进程同时读;
一次只允许一个写进程进行写操作;
如果有一个写进程正在进行写操作,禁止任何读进程进行读操作。

临界资源:
文件(共享资源)
读者个数计数器Rcount,初值为0

互斥信号量的设置:
Wmutex 控制对文件的访问,初值为1
Rmutex 控制对Rcount的访问,初值为1

写着算法
semaphore Wmutex=1, Rmutex=1;
int Rcount=0;

void writer( ) { // 写者进程
while (true) {
P(Wmutex); // 排斥对文件的访问
write; // 写数据
V(Wmutex); // 恢复对文件的访问
}
}
读者算法
void reader ( ) {
while (true) {
P(Rmutex); // 排斥对Rcount的访问
if (Rcount==0) P(Wmutex);
// 如果这是第1个读者,则排斥对文件的写操作
Rcount=Rcount+1; // 又多了一个读者
V(Rmutex); // 恢复对Rcount的访问
read; // 读数据
P(Rmutex); // 排斥对Rcount的访问
Rcount=Rcount-1;
if (Rcount==0) V(Wmutex);
//如果这是最后一个读者,则恢复对文件的写操作
V(Rmutex); // 恢复对Rcount的访问
}
怎么样改成写着者优先,现在是只要有读者,写者就要等最后一个读者读完了才能写入,要改成写者一来就不能再读入了,而要等当前的读者读完就写者就写入。

3 回复
#2
system322007-04-07 10:48

发到编程区

#3
七斤饼2007-04-07 12:40
在它后面Rcount=Rcount+1; 加一句 if (Rcount==1) 的情况

单独的操作系统还能帮你解决 你的这些我都有些无奈了

你的这个问题随便一本操作系统书上都有啊
#4
yushui2007-04-07 19:45
void reader ( ) {
while (true) {
P(Rmutex); // 排斥对Rcount的访问
if (Rcount==0) P(Wmutex);
// 如果这是第1个读者,则排斥对文件的写操作
Rcount=Rcount+1; // 又多了一个读者
V(Rmutex); // 恢复对Rcount的访问(我觉得在这儿应该加个限制条件,就是写者来了就不恢复对Rcount的访问,而是等所有在进程的读者读完了写者来写入了后再读,可就是不知道怎么加)
read; // 读数据
P(Rmutex); // 排斥对Rcount的访问
Rcount=Rcount-1;
if (Rcount==0) V(Wmutex);
//如果这是最后一个读者,则恢复对文件的写操作
V(Rmutex); // 恢复对Rcount的访问
}
1