ITパスポート 2010年 春期 問82
問題文
2台のPCから一つのファイルを並行して更新した。ファイル中の同一データ(データ1)に対する処理が①~④の順に行われたとき、データ1はどの値になるか。ここで、データ1の初期値は5であった。

選択肢
ア:4(正解)
イ:5
ウ:14
エ:15
🔒 解説は解答すると表示されます
2台のPCから同一ファイルを並行更新したときの結果【ITパスポート 解説】
正解の理由
問題文の処理順序は①→②→③→④です。最初のデータ1の値は5でした。PC−Aは①で「読み込み」してを計算し、PC−Bは②で同じく「読み込み」してを計算しています。ここで重要なのは、①と②はどちらも「読み込み」を行い、元の値5をもとに別々に計算している点です。続く③でPC−Aが自分の計算結果(15)を書き込み、最後の④でPC−Bが自分の計算結果(4)を書き込むため、最終的にファイルに残る値は4になります。したがって正しい選択肢はア(4)です。
解法ステップ
- 初期値はデータ1 = 。
- ①(PC−A): データ1を読み込み → を基に を計算(まだ書き込みはしていない)。
- ②(PC−B): データ1を読み込み → 同じ を基に を計算(これもまだ書き込みはしていない)。
- ③(PC−A): ①の結果()をデータ1に書き込む → データ1 = になる。
- 「書き込み」=ファイルへ保存する操作。
- ④(PC−B): ②の結果()をデータ1に書き込む → データ1 = に上書きされる。
- 最終値は 。
ポイント:読み込み(read)時点の値が同じでも、その後の書き込み順で最終値が決まる「上書き」が起きます。
選択肢別の誤答解説
-
ア(4)
正しい。上の手順の通り、最後にPC−Bが書き込むため最終値は4になります。 -
イ(5)
間違い。これは「誰も書き込まなかった」と考えた場合の値です。しかし図の通り③と④で書き込みが行われているため、5のままではありません。 -
ウ(14)
間違い。 と単純に連続して計算した結果を答とする誤りです。しかし今回の処理順では「5に10足してから1引く」という連続処理になっていません。両者が独立に5を読み込んで計算し、最後に上書きする形なので14にはなりません。 -
エ(15)
間違い。これはPC−Aの書き込み(③)だけが生きている場合の値です。しかしその後にPC−Bが④で上書きしているため、15は最終値になりません。
よくある誤解
-
「読み込み→計算は順番どおりで、結果は合算される」
→ 実際には各PCが独立に同じ元値を読み込んでいると、後から書き込まれた結果が上書きされます。合算はされません。 -
「読み込みした時点の値が更新後に自動で反映される」
→ 一度読み込んだ値はその時点のスナップショットです。誰かが別で書き込んでも、読み込んだ側の計算結果は自動で変わりません。
補足コラム
この現象は「競合状態(レースコンディション:race condition)」の典型例です。競合状態とは、複数の処理が同じデータを同時に扱うときに、処理の実行順序によって結果が変わる問題です。特に今回のように一方の書き込みが他方の書き込みで上書きされてしまう状況は「ロストアップデート(lost update:更新の取りこぼし)」と呼ばれます。
防止策の例:
- ロック(lock:排他制御のための仕組み)
→ 他の処理がデータを扱っている間はそのデータをロックして、同時アクセスを防ぐ。最も直感的な方法です。 - トランザクション(transaction:一連の処理を一塊で正常に終わらせる仕組み)
→ 失敗時は全て元に戻すなど、一貫性を保ちます。データベースでよく使われます。 - 楽観的ロック(optimistic locking:楽観的に同時実行を許し、衝突時に検出して再試行する方式)と悲観的ロック(pessimistic locking:最初からロックして競合を防ぐ方式)
→ 状況に応じて使い分けます。 - 原子操作(atomic operation:途中で割り込まれない単一操作)
→ 単一の命令で読み書きを安全に行う方法です。
初学者の覚え方のヒント:買い物でレジが一つしかないのに複数人が同時に同じ商品を「最後にどっちが払うか」で争っているようなイメージです。最後に払った人の分だけが有効になります。
FAQ
Q1. もし④が先で③が後なら最終値はどうなりますか?
A1. その場合はPC−A(③)が最後に書き込むため最終値は15になります。書き込み順が結果を決めます。
A1. その場合はPC−A(③)が最後に書き込むため最終値は15になります。書き込み順が結果を決めます。
Q2. この問題は「バグ」でしょうか?
A2. 設計上は想定される挙動です。問題は共同で更新する場面で適切な同期(ロックやトランザクション等)を用いていないことにあります。実運用では同期処理を入れるべきです。
A2. 設計上は想定される挙動です。問題は共同で更新する場面で適切な同期(ロックやトランザクション等)を用いていないことにあります。実運用では同期処理を入れるべきです。
Q3. どうすれば両方の更新を反映できますか?
A3. 目的にもよりますが、両方の更新を合算したいなら「読み込み→更新→書き込み」を一つの同期した処理にまとめるか、トランザクションや原子演算で衝突を解消します。
A3. 目的にもよりますが、両方の更新を合算したいなら「読み込み→更新→書き込み」を一つの同期した処理にまとめるか、トランザクションや原子演算で衝突を解消します。
関連キーワード: 競合状態、レースコンディション、ロストアップデート、排他制御、ロック、トランザクション、原子操作、同時実行制御、共有データ、上書き順序

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

