基本情報技術者試験 - 令和4年12月修了 - 問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
答え : イ
分野 : テクノロジ系 › コンピュータシステム › ソフトウェア › オペレーティングシステム
解説 :
タスク間で共有される変数を,複数のタスクが同期を取らずに更新すると,実行の順序によっては意図しない結果が生じることがあります。

この問題では,共有変数xの初期値が3であり,タスクAはx=x+x(xを2倍にする処理)を,タスクBはx=x×x(xを2乗にする処理)を実行します。選択肢「イ」の実行順序では,まずa1でタスクAがxの値3を参照してeとし,次にb1からb4までタスクBの処理が全て実行されます。

b1とb2でxの値3を参照してhとiとし,b3でh×i,すなわち3×3を計算してjを9とし,b4でxの値を9に更新します。その後,a2でタスクAがxの値(この時点では9に更新されている)を参照してfとし,a3でe+f,すなわち最初に参照した3と後から参照した9を足して12を計算し,a4でxの値を12に更新します。この結果,最終的なxの値は12となり,これが正解です。他の選択肢の実行順序では,それぞれ異なる計算結果になり12にはなりません。
ホーム画面への追加方法
1.ブラウザの 共有ボタンのアイコン 共有ボタンをタップ
2.メニューの「ホーム画面に追加」をタップ
閉じる