问题描述:
多个进程共享一个数据区,这些进程分为两组:
- 读者进程:只读数据区中的数据;
- 写者进程:只往数据区中写数据
满足的要求
- 允许多个读者同时执行读操作
- 不允许多个写者同时操作
- 不允许读者、写者同时操作
第一类读者写者问题: 读者优先
如果读者执行:
- 无其他读者、写者,该读者可以读
- 若已有写者等,但有其他读者正在读,则该读者也可以读
- 若有写者正在写,该读者必须等
如果写者执行:
- 无其他读者、写者,该读者可以读
- 若有读者正在读,该写者等
- 若有其他写者正在写,该写者等
伪代码:
void reader(void){
while(TRUE){
P(mutex);
rc = rc + 1;
//只有第一个读者需要执行P(W)
if(rc == 1) P(w);
v(mutex);
//读操作
P(mutex);
rc = rc + 1;
//只有最后一个读者需要V(w)
if(rc == 0)V(w);
V(mutex);
}
}
void writer(void){
while(TRUE){
P(w);
//写操作
V(w);
}
}
其他知识点
- 进程互斥:各进程需要使用共享资源,而这些资源需要排他性使用,各进程之间竞争使用这些资源
-
临界区:各个进程中对某个临界资源实施操作的程序片段。
- 临界资源:系统中某些资源一次只允许一个进程使用,这样的资源称为临界资源或互斥资源或共享资源
- 第一类读者-写者问题解决的是多个读者问题
通过rc,保证读者可以同时读操作,而不要多次执行PV操作。除此之外的操作都是建立在在写不可读,在读不可写的基础上的。同时不存在多个写者的问题。
应用场景
Linux的IPX路由代码使用了读-写锁,读路由表的情况比更新路由表的情况多得多。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。