用C语言编程实现用信号量实现读者--写者问题(要源代码)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编程实现用信号量实现读者--写者问题(要源代码)相关的知识,希望对你有一定的参考价值。

操作系统实验题目,弄得我好头痛,望哪位大虾出手相助小妹感激不尽~~!!!实验要求如下:
读者-写者问题(the readers-writers problem)
问题描述:有两组并发进程:
读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个,即:
允许多个读者同时执行读操作,
不允许读者、写者同时操作,
不允许多个写者同时操作。
读者和写者的相互关系:
“读-写”互斥,
“写-写”互斥,
"读-读"允许
分析:
如果读者来:
1)无读者、写者,新读者可以读
2)有写者等,但有其它读者正在读,则新读者也可以读
3)有写者写,新读者等
如果写者来:
1)无读者,新写者可以写
2)有读者,新写者等待
3)有其它写者,新写者等待
采用信号量机制:
W表示“允许写或允许读”,初值:w=1。
即W表示读写的互斥信号量。
公共变量Rcount表示“正在读”的进程数,初值: Rcount =0;
mutex:表示对Rcount的互斥操作,初值: mutex=1。

读者:
do

Rcount++;
if (Rcount==1)
P (w);



Rcount--;
if (Rcount==0)
V(w);

while (false);

写者:
do

P(w);



V(w);

while (false)

参考技术A 汗 竟然是校友...
by monkeyking

“读者-写者问题”的写者优先算法实现

转自http://blog.csdn.net/zoudaokou2006/article/details/3966694

读者一写者问题是一个用信号量实现的经典进程同步问题。在系统中,一个数据集( 如文件或记录) 被几个并发进程共享,这些线程分两类,一部分只要求进行复操作,称之为“读者”;另一类要求写或修改操作,我们称之为“写者“。

一般而言,对一个数据集,为了保证数据的完整性、正确性,允许多个读者进程同时访问,但是不允许一个写者进程同其它任何一个进程(读者或者写者)同时访问,而这类问题就称之为”读者-写者“问题。

读者优先的算法在操作系统相关的书籍中都有介绍,这是一种最简单的解决办法:当没有写进程正在访问共享数据集时,读进程可以进入访问,否则必须等待。而读者优先的算法存在“饿死写者”线程的问题:只要有读者不断到来,写者就要持久地等待,直到 所有的读者都读完且没有新的读者到来时写者才能写数据集。而在很多情况下我们需要避免”饿死写者“,故而采用写者优先算法:

在写者优先算法中,我们要实现的目标是:

1.要让读者与写者之间、以及写者与写者之问要互斥地访同数据集;

2.在无写进程到来时各读者可同时访问数据集;

3.在读者和写者都等待时访问时写者优先.

一种算法实现:
我们将用两个不同的互斥信号量分别实现读者与写者间的互斥及各写者进程间的互斥:以互斥信号量Wmutex实现各写者问的互斥,互斥信号量Rmutex实现各读者与写者问的互斥;
设置两个整型变量Wcount和Rcount分别记录等待的写者数和正在读的读者数,因Wcount、Rcount都是共享变量,因此还要设置两个互斥信号量Mutl和Mut2以实现进程对这两个变最的互斥访问.

用信号量机制实现的写者优先的算法如 :

[c-sharp] view plain copy
Var Mut1,Mut2,Wmutex,Fmutex:Semaphore; 
Rcount,Wcount:integer; 
Mut1:=Mut2:=WMutex:=Fmutex:=1; 
Rcount:=Wcount:=0; 
//Fmutex --> 读者写者互斥 
//WMutex --> 写者互斥 
//Mut1 --> access to Rcount && 竞争Fmutex 
//Mut2 --> access to Wcount 


Writer:begin 
Wait(Mut1); 
Wcount:=Wcount+1; 
If Wcount=1 then Wait(Fmutex); //如有读者,写者阻塞在此处 
Signal(Mut1); 
Wait(WMutex); 

写者优先 

Signal(Mut1); //立即释放Mut1,使写者可以随时申请到Mut1 
Wait(Mut2); 
Rcount:=Rcount+1; 
If Rcount=1 then Wait(Fmutex); //第一个读者进入时,申请Fmutex;如有写者,第一个读者会阻塞在此处 
Signal(Mut2); 

读操作:

Wait(Mut2); 
Rcount:=Rcount-1; 
If Rcount=0 then Signal(Fmutex); //最后一个读者退出时,释放Fmutex 
Singal(Mut2); 
end 

代码解释:

1: 
读者、写者均按照Mut1、Fmutex的顺序申请信号量。

2:
写者获得Fmutex后,直至最后一个写者释放Fmutex,读者均被阻塞。
读者获得Fmutex后,直至最后一个读者(不包含由于Mut1被阻塞的读者)释放Fmutex,写者均被阻塞。

3.
读者申请到Mut1后立即释放;
而写者申请到Mut1后,就一直占用不放,直至申请到Fmutex。

4.总结
Fmutex的作用就是写者、读者间的互斥;
Mut1的额外作用就是帮助写者优先竞争到Fmutex。

以上是关于用C语言编程实现用信号量实现读者--写者问题(要源代码)的主要内容,如果未能解决你的问题,请参考以下文章

用信号量和读写锁解决读者写者问题

C++ 多线程学习笔记:读者-写者问题模拟

经典进程的同步问题(生产者--消费者问题哲学家进餐问题读者--写者问题)

操作系统 | 经典进程的同步问题(生产者--消费者问题哲学家进餐问题读者--写者问题)

操作系统学习笔记

操作系统学习笔记