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