信号量机制读者/写者问题写者优先的理解()

int readcount=0,writecount=0;semaphore x=1,y=1,z=1;//x用来对readcount进行互斥访问,y用来对writecount进行互斥访问,z用来对使用读锁进行互斥访问semaphore rmutex=1;wmutex=1;//读锁,写锁

由于写者优先,我们从读者优先的代码中得到灵感,这里可以给写者也添加一个记录写者数量的int型变量,当这个变量为0的时候,才允许写者访问临界区

写者的优先,也使得这里不能采用常用的单信号量访问机制,而是通过由读者和写者共同决定的rmutex来对读者进行限制,做到保证写者高优先级的同时读者自己又能够进入临界区同时可以多个读者一起读(这也是和其他的读写问题根本不同的地方)

最外层的z信号量由读者自己控制,而rmutex则由写者和读者共同控制,这样就保证了写者的优先级得到了保障

process reader{p(z);//用来保证判断一次只有一个读者,即保证次序p(rmutex);//这个信号量过后就能确保当前临界区中是没有写者的(这个是关键点)p(x);readcount++;if(readcount==1)p(wmutex);//如果现在有一个读者,那么往后优先级更高的写者不能进来v(x);//释放对radcount的访问权限v(rmutex);//释放对p(x)的访问权限v(z);read;p(x);readcount--;if(readcount==0)v(wmutex);v(x);}
process writer{p(y);writecount++;if(writecount==1)p(mutex);v(y);p(wmutex);write;v(wmutex);p(y);writecount--;if(writecount==0)v(rmutex);v(y);}
————————
int readcount=0,writecount=0;semaphore x=1,y=1,z=1;//x用来对readcount进行互斥访问,y用来对writecount进行互斥访问,z用来对使用读锁进行互斥访问semaphore rmutex=1;wmutex=1;//读锁,写锁

由于写者优先,我们从读者优先的代码中得到灵感,这里可以给写者也添加一个记录写者数量的int型变量,当这个变量为0的时候,才允许写者访问临界区

写者的优先,也使得这里不能采用常用的单信号量访问机制,而是通过由读者和写者共同决定的rmutex来对读者进行限制,做到保证写者高优先级的同时读者自己又能够进入临界区同时可以多个读者一起读(这也是和其他的读写问题根本不同的地方)

最外层的z信号量由读者自己控制,而rmutex则由写者和读者共同控制,这样就保证了写者的优先级得到了保障

process reader{p(z);//用来保证判断一次只有一个读者,即保证次序p(rmutex);//这个信号量过后就能确保当前临界区中是没有写者的(这个是关键点)p(x);readcount++;if(readcount==1)p(wmutex);//如果现在有一个读者,那么往后优先级更高的写者不能进来v(x);//释放对radcount的访问权限v(rmutex);//释放对p(x)的访问权限v(z);read;p(x);readcount--;if(readcount==0)v(wmutex);v(x);}
process writer{p(y);writecount++;if(writecount==1)p(mutex);v(y);p(wmutex);write;v(wmutex);p(y);writecount--;if(writecount==0)v(rmutex);v(y);}