修了試験 2011-07-24実施分 基本情報技術者試験 問23
各タスクがタスク間共有変数を更新するときに,タスク間の同期制御を行わないと思わぬ結果を招くことがある。 タスク間共有変数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で、各選択肢の順番どおりに値を追跡します。 【計算】 選択肢2の順にたどります。 a1でe=3、b1でh=3、b2でi=3となります。 b3でj=3×3=9となり、b4でx=9に更新されます。 a2で更新後のxを参照し、f=9となります。 a3でg=e+f=3+9=12となり、a4でx=12に更新されます。 最終的なxは12です。 【選択肢別解説】 1:× e=3、f=3、h=3、i=3と先に参照し、a4でx=6、b4でx=9に更新されます。 最終値は9です。 2:○ タスクAが古い値3と、タスクBが更新した9を足すため、3+9=12になります。 3:× h=3、e=3、f=3となり、a4でx=6に更新された後にb2でi=6を参照します。 b3でj=3×6=18となり、最終値は18です。 4:× タスクBがj=9を計算した後、タスクAがx=6に更新しますが、最後にb4でx=9に上書きされます。 最終値は9です。 【ポイント】 共有変数を複数のタスクが更新するときは、セマフォなどで排他制御を行う必要があります。 排他制御がないと、実行の順番によって結果が変わってしまいます。まとめて解く
修了試験 2011-07-24実施分を通しで解く(80問)→