29 lines
1.2 KiB
Markdown
29 lines
1.2 KiB
Markdown
### Monitors
|
|
Semaphores are hard to use in practice because quite low level Monitors provide an easier definition of concurrent objects at the level of Prog. Lang.
|
|
|
|
It guarantees mutual exclusion.
|
|
|
|
Inter-process synchronization is done through *conditions*, which are objects that provide the following operations:
|
|
- ***wait*:** the invoking process suspends, enters into the condition's queue, and releases the mutex on the monitor
|
|
- ***signal*:** if no process is in the condition's queue, the nothing happens. Otherwise
|
|
- reactivates the first suspended process, suspends the signaling process that however has a priority to re-enter the monitor (*Hoare semantics*)
|
|
- completes its task and the first process in the condition's queue has the priority to enter the monitor (after that the signaling one terminates or suspends) (*Mesa semantics*).
|
|
|
|
#### A very typical use: Rendez-vous
|
|
A soon as a process arrives at a barrier it needs to suspend and wait for every other process to reach the barrier.
|
|
|
|
```
|
|
monitor RNDV :=
|
|
cnt ∈ {0,…,m} init at 0
|
|
condition B
|
|
operation barrier() :=
|
|
cnt++
|
|
if cnt < m then
|
|
B.wait()
|
|
else
|
|
cnt <- 0
|
|
B.signal()
|
|
return
|
|
```
|
|
The last process wakes up one of the others... Then he wakes up another one etc...
|
|
|