⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reed-write.txt

📁 读者优先算法
💻 TXT
字号:

读者优先算法:

设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据
                    rmutex  用于读者互斥的访问读者计数器readcount

var rwmutex, rmutex : semaphore := 1,1 ;
int readcount = 0; 
cobegin
       readeri begin  // i=1,2,….
              P(rmutex);
              Readcount++;
              If (readcount == 1) P(rwmutex);
              V(rmutex);
              读数据;
              P(rmutex);
              Readcount--;
              If (readcount == 0) V(rwmutex);
              V(rmutex);
       End
       Writerj begin // j = 1,2,….
              P(rwmutex);
              写更新;
              V(rwmutex);
       End 
Coend 
写者优先:

条件:

1)多个读者可以同时进行读
2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

解1:如果读者数是固定的,我们可采用下面的算法:

rwmutex:用于写者与其他读者/写者互斥的访问共享数据 
rmutex: 该信号量初始值设为10,表示最多允许10个读者进程同时进行读操作

var rwmutex, rmutex : semaphore := 1,10 ;
cobegin
       readeri begin  // i=1,2,….
              P(rwmutex);  //读者、写者互斥
              P(rmutex);
              V(rwmutex);  // 释放读写互斥信号量,允许其它读、写进程访问资源
              读数据;
              V(rmutex);
       End              

       Writerj begin // j = 1,2,….
              P(rwmutex);
              For (i=1;i<=10;i++) P(rmutex); //禁止新读者,并等待已进入的读者退出
              写更新;
              For (i=1;i<=10;i++) V(rmutex); // 恢复允许rmutex 值为10
              V(rwmutex); 
       End 
Coend 

 

解2:如果读者数不固定,采用下面的算法:

设置三个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据
                    rmutex  用于读者互斥的访问读者计数器readcount                                                   nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作

var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ; 
int readcount = 0;
cobegin
       readeri begin  // i=1,2,….
              P(rwmutex); 
              P(rmutex);
              Readcount++;
              If (readcount == 1) P(nrmutex); //有读者进入,互斥写操作
              V(rmutex);
              V(rwmutex); // 及时释放读写互斥信号量,允许其它读、写进程申请资源
              读数据;
              P(rmutex);
              Readcount--;
              If (readcount == 0) V(nrmutex); //所有读者退出,允许写更新
              V(rmutex);
       End

       Writerj begin // j = 1,2,….
              P(rwmutex);  // 互斥后续其它读者、写者
              P(nrmutex);  //如有读者正在读,等待所有读者读完
              写更新;
              V(nrmutex);   //允许后续新的第一个读者进入后互斥写操作 
              V(rwmutex);  //允许后续新读者及其它写者
       End 
Coend 


 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -