问题描述:

多个进程共享一个数据区,这些进程分为两组:

  • 读者进程:只读数据区中的数据;
  • 写者进程:只往数据区中写数据

 满足的要求

  1. 允许多个读者同时执行读操作
  2. 不允许多个写者同时操作
  3. 不允许读者、写者同时操作

第一类读者写者问题: 读者优先

如果读者执行:

  1. 无其他读者、写者,该读者可以读
  2. 若已有写者等,但有其他读者正在读,则该读者也可以读
  3. 若有写者正在写,该读者必须等

如果写者执行:

  1. 无其他读者、写者,该读者可以读
  2. 若有读者正在读,该写者等
  3. 若有其他写者正在写,该写者等

伪代码:

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);
    }
}

其他知识点

  1. 进程互斥:各进程需要使用共享资源,而这些资源需要排他性使用,各进程之间竞争使用这些资源
  2. 临界区:各个进程中对某个临界资源实施操作的程序片段。

    • 临界资源:系统中某些资源一次只允许一个进程使用,这样的资源称为临界资源或互斥资源或共享资源
  3. 第一类读者-写者问题解决的是多个读者问题

    通过rc,保证读者可以同时读操作,而不要多次执行PV操作。除此之外的操作都是建立在在写不可读,在读不可写的基础上的。同时不存在多个写者的问题。

应用场景

Linux的IPX路由代码使用了读-写锁,读路由表的情况比更新路由表的情况多得多。


Andy
14 声望2 粉丝

不要bug