进程同步读者写者问题
- 格式:doc
- 大小:94.00 KB
- 文档页数:5
读者写者问题
1、实验目的
使用高级语言编写程序,实现进程同步。
即,读者写者之间对buffer的互斥使用,读者读者之间对count的互斥使用。
2、实验内容
1)、开启4个thread线程,即分别代表1个写者,3个读者。
2)、设置了wmutex,rmutex两个信号量,以及count来统计读者的数量,content来保存写者写入的东西。
3、实验步骤
1)、直接执行程序即可。
4、实验小结
该程序使用JA VA语言写的,没有界面,在算法上一开始由于逻辑上的错误,结果程序运行之后就直接死锁了,后来在和同学的交流讨论下解决了这个问题。
该题目没有界面,仍可进一步优化。
5、程序源代码
import javax.swing.JOptionPane;
public class ReaderWriter
{
public static void main(String[] args)
{
Buffer buffer=new Buffer();
new Thread(new Writer(buffer)).start();
new Thread(new Reader(buffer)).start();
new Thread(new Reader(buffer)).start();
new Thread(new Reader(buffer)).start();
}
}
class Buffer//Buffer 相当于公共数据区
{
int wmutex,rmutex;//buffer的互斥信号量,表示目前buffer为空,rmutex:readcount互斥信号量
int content;//
int count;//统计读者人数
public Buffer()
{
wmutex=1;//1:可用,0:不可用
rmutex=1;
content=0;//用于存放内容
count=0;
}
public synchronized void read()//attention to this:不用传递参数
{
if(rmutex==0)//rmutex锁上了
{
try
{
this.wait();//阻塞当前进程
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
else//目前rmutex为开锁
{
if(count==0)//目前处于写态,所以,阻塞进程
{
waitW();//
}
rmutex=0;//申请资源
count++;
System.out.println("reader"+Thread.currentThread().getName()+"............read............"+conte nt);
//读完就走就释放资源
count--;
if(count==0)
{
notifyW();
}
notify();
rmutex=1;//释放count锁
}
}
public synchronized void write()
{
if(wmutex==0&&rmutex==0)//buffer、和count都上锁,正在读
{
try
{
this.wait();//阻塞当前进程
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
else
{
wmutex=1;//如果没有发生if下面的条件,则申请资源并且上锁
String str=JOptionPane.showInputDialog("请输出要写的数(|X|<30000):");
content=Integer.parseInt(str);
System.out.println("writer"+"写进了.............."+content);
wmutex=0;//开锁
notify();
}
}
public synchronized void waitW()
{
if(wmutex==0)//正在写
{
try
{
this.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
wmutex=0;//申请资源,即上锁
}
}
public synchronized void notifyW()
{
notify();
wmutex=1;//释放buffer锁
}
}
class Reader implements Runnable//读进程
{
Buffer buffer;
public Reader(Buffer buffer)//此处实现两类人,用一个缓冲池{
this.buffer=buffer;
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
buffer.read();
try
{
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
class Writer implements Runnable//写进程
{
Buffer buffer;
public Writer(Buffer buffer)//此处实现两类人,用一个缓冲池{
this.buffer=buffer;
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
buffer.write();
try
{
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
6、截图展示:。