问题描述:
多个进程共享一个数据区,这些进程分为两组:
- Markdown和扩展Markdown简洁的语法
- 代码块高亮
- 读者进程:只读数据区中的数据
- 写着进程:只往数据区写数据
要求满足的条件:
- 允许多个读者同时执行读操作
- 不允许多个写者同时操作
- 不允许读者、写者同时操作
第一类读者写者问题:读者优先
如果读者执行:
- 无其他读者、写者,该读者可以读
- 若已有写者等待,但有其他读者正在读,则该读者也可以读
- 若有写者正在写,则该读者必须等
如果写者执行
- 无其他读者、写者,该写者可以写
- 若有读者正在读,该写者等待
- 若有其他读者正在写,该写者等待
解法实现:
void reader(void)
{
while(TRUE)
{
P(mutex);
rc = rc + 1;
if(rc == 1) /*第一个读者*/
{
P(W); /*不需要每给读者都做*/
}
V(mutex);
读操作;
P(mutex);
rc = rc - 1;
if (rc == 0)/*最后一个读者*/
{
V(w);
}
V(mutex);
其他操作;
}
}
void writer(void)
{
while(TRUE)
{
......
P(W);
写操作;
V(w);
......
}
}
应用实例:
- 应用场景
如果每个执行实体对临界区的访问或者是读或者是写共享变量,但它们都不会即读又写时,读写锁是最好的选择 - 实例
LINUX的IPX路由代码中使用了读写锁,用ipx_routes_lock的读写锁保护IPX路由表的并发访问