//信号量结构体
struct semaphore
{
int count;//消耗资源
PCB* queue;//等待在信号量上的进程
};
//信号量的两种操作
P(semaphore &s)
{
s.count--;
if(s.count<0)
{
//1、阻塞该进程;
//2、将该进程插入等待队列s.queue;
}
}
V(semaphore &s)
{
s.count++;
if(s.count<=0)//value=0,生产资源前value=-1,有阻塞的进程
{
//1、唤醒进程,
//即等待队列s.queue中取出第一个进程P插入就绪队列
}
}
//读者优先
semaphore mutex = 1;//对数据区的互斥访问
semaphore rmutex = 1;//对readcount的互斥访问
int readcount = 0;//记录读者数量
writer()
{
while(true)
{
P(mutex);
write();
V(mutex);
}
}
reader()
{
while(true)
{
P(rmutex);//readcount使用权的互斥访问
if(readcount == 0) P(mutex);//第一个进入的读者,要阻止写者进入
readcount++;
V(rmutex);
read();
P(rmutex);
readcount--;
if(readcount == 0) V(mutex);//没有读者了,允许写者进入
V(rmutex);
}
}
//写者优先
semaphore mutex = 1;//互斥访问数据区
semaphore rmutex = 1;//读者互斥访问readcount
semaphore wmutex = 1;//写者互斥访问writecount
semaphore readable = 1;//用于实现写者插队,设置的一个等待位
reader()
{
while(true)
{
P(readable);//检查是否有写者进程,没有则占用,即阻塞等待位
P(rmutex);//阻塞读者
if(readcount == 0) P(mutex);//阻塞写者
readcount++;
V(rmutex);//唤醒读者
V(readable);//唤醒等待位
read();
P(rmutex);//阻塞读者
readcount--;
if(readcount == 0) V(mutex);//唤醒写者
V(rmutex);//唤醒读者
}
}
writer()
{
while(true)
{
P(wmutex);
if(writecount == 0) P(readable);//第一个写者,阻止读者进入
writecount++;
V(wmutex);
P(mutex);//互斥访问数据区
write;
V(mutex);
P(wmutex);
writecount--;
if(writecount == 0) V(readable);
V(wmutex);
}
}