71 lines
No EOL
966 B
Markdown
71 lines
No EOL
966 B
Markdown
```
|
|
GLOB_MUTEX, W_MUTEX, PR_MUTEX and R_MUTEX semaphores init. at 1
|
|
R a shared register init. at 0
|
|
|
|
begin_read() :=
|
|
PRR_MUTEX.down()
|
|
R_MUTEX.down()
|
|
R++ # currently active readers
|
|
if R = 1 then
|
|
PRW_MUTEX.down()
|
|
GLOB_MUTEX.down()
|
|
R_MUTEX.up()
|
|
PRR_MUTEX.up()
|
|
return
|
|
|
|
end_read() :=
|
|
R_MUTEX.down()
|
|
R--
|
|
if R = 0 then
|
|
GLOB_MUTEX.up()
|
|
PRW_MUTEX.up()
|
|
R_MUTEX.up()
|
|
return
|
|
|
|
begin_write() :=
|
|
PRR_MUTEX.down()
|
|
PRW_MUTEX.down()
|
|
PRW_MUTEX.up()
|
|
GLOB_MUTEX.down()
|
|
return
|
|
|
|
end_write() :=
|
|
PRR_MUTEX.up()
|
|
GLOB_MUTEX.up()
|
|
return
|
|
```
|
|
|
|
```
|
|
monitor RW_READERS :=
|
|
AR, WR, AW, WW init at 0
|
|
condition CR, CW, CR_PR
|
|
|
|
operation begin_read() :=
|
|
WR++
|
|
if WW != 0 then
|
|
CR_PR.wait()
|
|
if AW != 0 then
|
|
CR.wait()
|
|
CR.signal()
|
|
AR++
|
|
WR--
|
|
|
|
operation end_read() :=
|
|
AR--
|
|
if AR = 0 then
|
|
CW.signal()
|
|
|
|
operation begin_write() :=
|
|
WW++
|
|
if (AR + AW != 0) then
|
|
CW.wait()
|
|
AW++
|
|
WW--
|
|
|
|
operation end_write() :=
|
|
AW--
|
|
if WR > 0 then
|
|
CR.signal()
|
|
else
|
|
CW.signal()
|
|
``` |