データベース

基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問17

各タスクがタスク間共有変数を更新するときに,タスク間の同期制御を行わないと思わぬ結果を招くことがある。タスク間共有変数 x の初期値が 3 の場合,タスク A が代入文 x=x+x を実行し,タスク B が代入文 x=x×x を実行すると,最終的な x の値が 12 となるのは,どの順番で実行されたときか。ここで,各代入文はそれぞれ次の四つの部分に分けて処理される。
タスク A (x=x+x) a1 x の値を参照し e とする。 a2 x の値を参照し f とする。 a3 e+f を計算し g とする。 a4 x の値を g に更新する。 タスク B (x=x×x) b1 x の値を参照し h とする。 b2 x の値を参照し i とする。 b3 h×i を計算し j とする。 b4 x の値を j に更新する。
  • ア a1 → a2 → b1 → b2 → a3 → a4 → b3 → b4
  • イ a1 → b1 → b2 → b3 → b4 → a2 → a3 → a4
  • ウ b1 → a1 → a2 → a3 → a4 → b2 → b3 → b4
  • エ b1 → b2 → b3 → a1 → a2 → a3 → a4 → b4

出典:基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問17

答えと解説を見る

正解:イ

覚える知識

排他制御なし共有変数更新の実行順序トレース

排他制御がないと、参照と更新の順序次第で共有変数の最終値が実行順序で変わる。

この問題で必要なこと

各手順を順にトレースする。a1→b1→b2→b3→b4→a2→a3→a4 ではxが3→9になり、aは e=3、f=9で12になる。

ひっかけ

どの手順が参照した値を使うかを取り違えると、他の順序でも12になるように見えてしまう。

この知識の出題:本試験系 0 回・免除試験 10 回(公開問題での観測値)

この知識をアプリで解いて覚える レッスン「トランザクションと排他制御(ロック・デッドロック)」で学ぶ

同じ知識の過去問