
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
2つのスレッドを、セマフォS1(初期値1)とS2(初期値0)で同期させ、変数counterのインクリメントと表示を交互に実行して1から順に整数を表示するプログラムの、wait/signalの組合せを選ぶ問題。
2つのセマフォを用いて、2つのスレッドを交互に動作させる同期の書き方を問う問題。
① wait(S): Sが1以上なら1減らして進み、0なら待つ。signal(S): Sを1増やす。自分の番をwaitし、処理後に相手の番をsignal
② proc_1: wait(S1)→counter++→signal(S2)。proc_2: wait(S2)→printf→signal(S1)
③ ②
S1=1、S2=0で、まずスレッド1(proc_1)が動く必要がある。proc_1は、冒頭でwait(S1)を行い(S1を1→0にして進む)、counter++を実行した後、signal(S2)でS2を0→1にして、proc_2に実行を渡す。proc_2は、冒頭でwait(S2)で待ち、S2がsignalされたらprintfを実行し、最後にsignal(S1)でproc_1に実行を渡す。したがってア=wait(S1)、イ=signal(S2)、ウ=wait(S2)、エ=signal(S1)となり、②が正しい。これにより、インクリメントと表示が交互に行われ、1、2、3、…と表示される。
■ セマフォのwaitとsignal
セマフォは、スレッドどうしが「順番」を守るための合図に使う数値です。
・wait(S): Sが1以上なら1減らしてそのまま進む。Sが0なら、他のスレッドがsignalするまで待つ。
・signal(S): Sを1増やす(Sで待っているスレッドがあれば進めるようにする)。
この問題では、S1は「proc_1が進んでよい」、S2は「proc_2が進んでよい」という合図として使います。初期値がS1=1、S2=0なので、最初に進めるのはproc_1だけです。
2つのスレッドを交互に動かすには、セマフォを2つ用意し、「自分の番を待つ(wait)→処理→相手の番を通知(signal)」とする。初期値は、最初に動かす側を1、他方を0にする。
キーワード: セマフォ、wait、signal、スレッド、同期、排他制御、生産者消費者、情報工学部門