修了試験 2014-12-21実施分 基本情報技術者試験 問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 gによってxの値を更新する。 タスクB(x=x×x) b1 xの値を参照しhとする。 b2 xの値を参照しiとする。 b3 h×iを計算しjとする。 b4 jによってxの値を更新する。
正答2
解説
正解は2です。 同期制御をしないと、タスクが途中の古い値を参照して結果が変わる例です。 xの初期値は3であり、各手順の値を1行ずつたどって、最終的に12になる順序を探します。 選択肢は、a1〜a4とb1〜b4を実行する順序を示しています。 【選択肢別解説】 1:× a1でe=3、a2でf=3、b1でh=3、b2でi=3です。 a3でg=6、a4でx=6となりますが、b3でj=3×3=9、b4でx=9に上書きされます。 最終値は9です。 2:○ a1でe=3、b1でh=3、b2でi=3、b3でj=9、b4でx=9です。 続くa2では更新後のxを参照してf=9となり、a3でg=3+9=12、a4でx=12です。 最終値は12です。 3:× b1でh=3、a1でe=3、a2でf=3、a3でg=6、a4でx=6です。 b2では更新後のxを参照してi=6、b3でj=3×6=18、b4でx=18です。 最終値は18です。 4:× b1でh=3、b2でi=3、b3でj=9です。 a1〜a4はx=3のままを参照するのでg=6、x=6となりますが、b4でx=9に上書きされます。 最終値は9です。 【ポイント】 共有変数を参照してから更新するまでの間に他タスクが割り込むと、結果が実行順序に左右されます。 これを防ぐには、セマフォやロックで一連の処理を排他制御します。まとめて解く
修了試験 2014-12-21実施分を通しで解く(80問)→