データ D を更新する二つの処理 A,B が,①→③→②→④ のタイミングで実行された場合,D の値は幾らになるか。ここで,D の初期値は 2 とする。
| 処理A 〔処理内容〕 | 処理B 〔処理内容〕 |
|---|---|
| ① D を読み込み,3倍する。 | ③ D を読み込み,5を加える。 |
| ② ①の結果を,D に書き込む。 | ④ ③の結果を,D に書き込む。 |
この問題の解説と、これまでの解答の記録です。
データ D を更新する二つの処理 A,B が,①→③→②→④ のタイミングで実行された場合,D の値は幾らになるか。ここで,D の初期値は 2 とする。
| 処理A 〔処理内容〕 | 処理B 〔処理内容〕 |
|---|---|
| ① D を読み込み,3倍する。 | ③ D を読み込み,5を加える。 |
| ② ①の結果を,D に書き込む。 | ④ ③の結果を,D に書き込む。 |
6 は①の計算結果 (2×3) を②で書き込んだ直後の値だが、その後に④で処理B が 7 を上書きするため最終値としては残らない。6 が答えになるのは ①→③→④→② の順、つまり処理B の書き込みが先で処理A の書き込みが後になる場合であり、本問の ①→③→②→④ とは順序が異なる。
正解 正解は イ (7)。読み込み (参照) と書き込み (更新) を分けて、①→③→②→④ の順に D の値と各処理が手元に持つ計算結果を追跡する。初期値は D=2。① 処理A が D を読み込み 2×3=6 を計算するが、この時点ではまだ書き込んでいないので D は 2 のまま。③ 処理B が D を読み込む。②の書き込みがまだ済んでいないため、処理B が読むのは古い値 2 であり、2+5=7 を計算する。② 処理A が①の結果 6 を D に書き込み、D=6 になる。④ 処理B が③の結果 7 を D に書き込み、D=6 を上書きして D=7 となる。最後に書き込んだ処理B の値が残るため答えは 7。ここで処理A の更新 (6) は処理B に上書きされて消えており、これが排他制御を行わなかったときに起こる「更新の消失 (ロストアップデート)」である。
11 は処理A が完全に終わってから処理B が読み込んだ場合、すなわち ①→②→③→④ の順に直列実行したときの値 ((2×3)+5=11) である。本問では③が②より先に実行されるため、処理B が読むのは更新後の 6 ではなく初期値 2 であり、11 にはならない。排他制御が正しく働いた理想の結果と取り違えないこと。
21 は処理B が先に完了してから処理A が読み込んだ場合、すなわち ③→④→①→② の順に直列実行したときの値 ((2+5)×3=21) である。本問では①が最初なので処理A が読むのは 2 であり、7 を 3倍する場面は生じない。