ITパスポート 2009年 春期 問82
問題文
データDを更新する二つの処理A、Bが、①→③→②→④のタイミングで実行された場合、Dの値は幾らになるか。ここで、Dの初期値は2とする。

選択肢
ア:6
イ:7(正解)
ウ:11
エ:21
🔒 解説は解答すると表示されます
Dを更新する二つの処理の実行順序でDの値はいくらになるか【ITパスポート 解説】
正解の理由
処理Aは「Dを読み込み、3倍して書き込む」。処理Bは「Dを読み込み、5を加えて書き込む」です。実行タイミングが ①→③→②→④(つまり、Aの読み込み→Bの読み込み→Aの書き込み→Bの書き込み)になっているため、両方の処理は「読み込み(read)」時に共に初期値の 2 を読み取ります。Aはその読み取った 2 を3倍して 6 を作り、後で書き込みます。Bは同じく読み取った 2 に5を足して 7 を作り、最後に書き込みます。最終的に上書きされた値は B の書き込み 7 になるため、答えは イ(7)です。
(用語:読み込み=read(変数の現在の値を取得すること)、書き込み=write(変数に値を保存すること))
解法ステップ
- 初期値 D = 2 を確認する。
- ①(処理Aの読み込み):Aは D を読み込み、値は 2。A はそれを 3倍して内部結果を 6 とする。まだ D は変更されない。
- ③(処理Bの読み込み):Bは D を読み込み、まだ誰も書き込んでいないので値は 2。B はそれに 5 を加えて内部結果を 7 とする。まだ D は変更されない。
- ②(処理Aの書き込み):A が内部結果 6 を D に書き込む。これで D = 6 になる。
- ④(処理Bの書き込み):B が内部結果 7 を D に書き込む。これで D = 7(最終値)になる。
簡潔に言うと、読み込みが先に2つ行われたので両方とも「2」から計算し、最後に書き込まれた値(Bの7)が残ります。
選択肢別の誤答解説
-
ア: 6
- どのような状況で6になるか:Bの書き込み(④)が行われなかった場合、Aが書き込んだ6のまま終わると6になります。
- なぜ今回の図では当てはまらないか:図では④が存在し、Bが最後に7を書き込むため6にはならない。
-
イ: 7(正解)
- 理由:上の「正解の理由」と「解法ステップ」を参照。
-
ウ: 11
- どのような状況で11になるか:Aが読み込み→書き込みを完了してから、Bがその書き込まれた値を読み込んで加算する順序(Aの①→②→Bの③→④)なら、Aが2を3倍して6を書き込み、Bが6を読み込んで+5=11を書き込むため11になります。
- 今回はこの順序ではないため11にはならない。
-
エ: 21
- どのような状況で21になるか:Bが先に読み込み→書き込みをしてからAがその結果を読み込んで倍する順序(Bの③→④→Aの①→②)だと、Bが2に5を足して7を書き込み、Aが7を読み込んで3倍=21を書き込むため21になります。
- 今回はその順序でもないため21にはならない。
よくある誤解
-
「読み込みは常に最新の値を読む」
- 誤解の理由:図で読み込みが行われた時点での値を読むため、「読み込み後に他が書き込む」ことがあると最新値を読まない場合があります。今回のように両方が先に読み込むと、どちらも古い値(2)を基に計算します。
-
「読み取り+計算+書き込みは一つの操作(原子的)だ」
- 誤解の理由:実際は読み取りと書き込みの間に他の処理が入ることがあります(原子的でない)。そのため順序によって結果が変わります。これが「競合(レースコンディション)」の典型です。
補足コラム
この問題は「競合(レースコンディション)」と「ロストアップデート(更新の上書き)」を学ぶ良い例です。
- 競合(race condition):複数の処理が同じデータを非同期に読み書きすると、実行順序によって結果が変わる問題。
- ロストアップデート(lost update):複数の更新が行われる際に、一方の更新が他方の更新によって上書きされてしまい、本来の更新が失われる現象。今回のケースではAが計算した6がBの最後の書き込みで上書きされ、Aの更新が「失われた」と言える場面です。
実務での対策例(初心者向け)
- 排他制御(ロック):ある処理がDを更新している間は他を待たせる。
- トランザクションと整合性チェック:読み取り時と書き込み時のバージョンをチェックして整合性が崩れていたら再試行する。
- 原子操作:ハードウェアや言語で提供される一度に完了する更新操作を使う。
簡単なコード例(今回の並び ①→③→②→④ を再現)
D = 2
# ① A reads and computes
A_val = D * 3 # = 6
# ③ B reads and computes
B_val = D + 5 # = 7
# ② A writes
D = A_val # D becomes 6
# ④ B writes
D = B_val # D becomes 7
print(D) # 出力: 7
FAQ
Q. もし読み込みの直後に書き込みが行われればどうなる?
A. 読み込み直後に書き込みが行われれば、その書き込み後に別の処理が読み込めば最新値を読みます。順序次第で結果は変わります。重要なのは「読み込んだ時の値」がその後の計算に使われる点です。
A. 読み込み直後に書き込みが行われれば、その書き込み後に別の処理が読み込めば最新値を読みます。順序次第で結果は変わります。重要なのは「読み込んだ時の値」がその後の計算に使われる点です。
Q. この問題は現実のシステムで起きるのですか?
A. はい。データベースやマルチスレッドプログラムなどでよく起きます。対策としてロックやトランザクションを使います。
A. はい。データベースやマルチスレッドプログラムなどでよく起きます。対策としてロックやトランザクションを使います。
Q. ITパスポート試験でこのような問題が出たら、何をチェックすれば良い?
A. 「読み込み/書き込みの順序」を時系列で追い、各読み込みでどの値が使われるかを明確にすること。図に番号(①〜④)があれば、それに従って値を追うと確実です。
A. 「読み込み/書き込みの順序」を時系列で追い、各読み込みでどの値が使われるかを明確にすること。図に番号(①〜④)があれば、それに従って値を追うと確実です。
関連キーワード: 競合、ロストアップデート、読み取り・書き込み、排他制御、トランザクション、整合性、同期化

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

