戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

ITパスポート 2009年 春期 82


問題文

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

選択肢

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(変数に値を保存すること))

解法ステップ

  1. 初期値 D = 2 を確認する。
  2. ①(処理Aの読み込み):Aは D を読み込み、値は 2。A はそれを 3倍して内部結果を 6 とする。まだ D は変更されない。
  3. ③(処理Bの読み込み):Bは D を読み込み、まだ誰も書き込んでいないので値は 2。B はそれに 5 を加えて内部結果を 7 とする。まだ D は変更されない。
  4. ②(処理Aの書き込み):A が内部結果 6 を D に書き込む。これで D = 6 になる。
  5. ④(処理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にはならない。

よくある誤解

  1. 「読み込みは常に最新の値を読む」
    • 誤解の理由:図で読み込みが行われた時点での値を読むため、「読み込み後に他が書き込む」ことがあると最新値を読まない場合があります。今回のように両方が先に読み込むと、どちらも古い値(2)を基に計算します。
  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. 読み込み直後に書き込みが行われれば、その書き込み後に別の処理が読み込めば最新値を読みます。順序次第で結果は変わります。重要なのは「読み込んだ時の値」がその後の計算に使われる点です。
Q. この問題は現実のシステムで起きるのですか?
A. はい。データベースやマルチスレッドプログラムなどでよく起きます。対策としてロックやトランザクションを使います。
Q. ITパスポート試験でこのような問題が出たら、何をチェックすれば良い?
A. 「読み込み/書き込みの順序」を時系列で追い、各読み込みでどの値が使われるかを明確にすること。図に番号(①〜④)があれば、それに従って値を追うと確実です。

関連キーワード: 競合、ロストアップデート、読み取り・書き込み、排他制御、トランザクション、整合性、同期化
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について