[9 p] Kriittinen alue (vaihe). Oletetaan,
että monisäikeisen ohjelman yhteisessä
muistissa olevien muuttujien X, Y ja Z
käyttöä halutaan suojata kriittisen vaiheen
avulla. Muuttujiin viitataan ohjelmassa viidessä
kohtaa (kohdat A, B, C, D ja E):
A: X <- 7 B: some1 <- X C: Y <- 87 D: some4 <- X E: some5 <- Y
Y <- 4 some2 <- Y Y <- 0
Z <- X+Y some3 <- Z
Kohdassa A muuttujien Y ja Z vanhat arvot eivät saa
näkyä muille sen jälkeen, kun X on saanut
uuden arvon, ja Z'n uuden arvon tulee olla X'n ja Y'n uusien arvojen
summa. Kohdassa B muuttujien some1, some2 ja some3 arvoiksi tulee tulla
X'n, Y'n ja Z'n arvot käskysarjan suorituksen
alkuhetkellä. Kohdassa E muuttujan Y arvo tulee nollata välittömästi sen lukemisen jälkeen.
- Mitkä näistä
(pseudo)koodinpätkistä (A, B, C, D ja E) tulee
suojata
kriittisenä alueena ja miksi? Miksi niitä muita ei tarvitse suojata?
- Anna virheelliseen lopputulokseen johtava suoritusskenaario, jos kriittisiä alueita ei ole suojattu. Selitä, miksi tulos on virheellinen ja mistä virhe aiheutui? Tapahtuuko sama virhe joka suorituskerta?
- Näytä (pseudokooditasolla), kuinka
näiden säikeiden kriittiset vaiheet
suojataan busy-wait -loopissa (esim. test-and-set -käskyn avulla). Millaisessa
laskentaympäristössä tämä
olisi järkevä ratkaisu? Miksi?