93 lines
No EOL
1.3 KiB
Markdown
93 lines
No EOL
1.3 KiB
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, LASTW init at 0
|
|
condition CR, CW
|
|
|
|
operation begin_read() :=
|
|
if WW + AW != 0 then
|
|
CR.wait()
|
|
CR.signal()
|
|
AR++
|
|
|
|
operation end_read() :=
|
|
AR--
|
|
if AR = 0 then
|
|
CW.signal()
|
|
|
|
operation begin_write() :=
|
|
WW++
|
|
LASTW <- i
|
|
CW.signal() # wakes eventually other waiting writers *they will return false*
|
|
if (AR + AW != 0) then
|
|
CW.wait()
|
|
if (LASTW != i) then
|
|
return false
|
|
AW++
|
|
WW--
|
|
return true
|
|
|
|
operation end_write() :=
|
|
AW--
|
|
if WW > 0 then
|
|
CW.signal()
|
|
else
|
|
CR.signal()
|
|
```
|
|
|
|
```
|
|
CNT initalized to the value I want to initalize the semaphore
|
|
Condition S
|
|
|
|
up() :=
|
|
if CNT < 0 then
|
|
S.signal()
|
|
CNT++
|
|
|
|
down() :=
|
|
CNT--
|
|
if CNT < 0 then
|
|
S.wait()
|
|
```
|
|
|
|
|
|
```
|
|
p1: (T1)[Rx Wx]
|
|
p2: (T2) [Wx]
|
|
``` |