次のプログラムの2つの関数をオペレーティングシステム上で2つのスレッドとして起動し、proc_1関数 (スレッド1) では、変数 counter
の値をインクリメント、proc_2関数 (スレッド2) では、変数の値を表示するものとする。共有変数を counter、同期処理を実現するためセマフォを2つ
(S1とS2) 用いることとした。結果として、1、2、3、4、...と整数を1 から順に表示するプログラムを考える。セマフォ S1 = 1 と
S2 = 0 に初期値を設定し、2つの関数proc_1、proc_2を各々スレッドとして起動する時、プログラム中の に入る語句の組合せとして、最も適切なものはどれか。
int counter = 0; /*表示する値を格納する変数。スレッド間で共用される。*/
void proc_1() {
for( ; ; ) {
ア ;
counter++:
イ ;
}
}
void proc_2() {
for( ; ; ) {
ウ ;
printf("%d", counter);
エ ;
}
}
ア イ ウ エ
@ signal(S1) wait(S2) signal(S2) wait(S1)
A wait(S1) signal(S2) wait(S2) signal(S1)
B signal(S1) wait(S1) signal(S2) wait(S2)
C wait(S1) signal(S1) wait(S2) signal(S2)
D wait(S1) signal(S2) signal(S2) wait(S1)
A
セマフォは、複数のプロセスが並行して動作し、一つの資源を共有する場合にそのアクセスを制御するための機構のことである。
セマフォの値は「あといくつのプロセスが使えるか」を表す。
wait() はP操作ともいい、セマフォの値から1を引き、実行を継続する。
signal() は V操作ともいい、セマフォの値に1を足し、待っているタスクが実行可能となる。
初期値がS1 = 1 と S2 = 0だから
アに wait(S1) を入れると、S1 = 1だから、1を引いた0 となり処理が継続する一方、ウにwait(S2) を入れると、S2 = 0 だから、処理ができずに、止まったままとなる。
次に、proc_1 でcounterが 1 になり、イに signal(S2) を入れると、S2 = 0 だから、1を足した1 となり、proc_2 が実行可能となる。一方、proc_1では、wait(S1) により、S1 = 0だから、処理ができずに、止まったままとなる。
proc_2では、prontf で counterの値を出力し、エにsignal(S1) を入れると、S1 = 0 だから、1を足した1 となり、proc_1 が実行可能となる。
2つのスレッドは、以下のように動作する。
proc_1 proc_2 値
wait(S1) S1:1⇒0 S2:0
counter++ counter:1
signal(S2) S1:0 S2:0⇒1
wait(S2) S1:0 S2:1⇒0
printf() counter:1
signal(S1) S1:0⇒1 S2:0
wait(S1) S1:1⇒0 S2:0
counter++ counter:2
signal(S2) S1:0 S2:0⇒1
wait(S2) S1:0 S2:1⇒0
printf() counter:2
signal(S1) S1:0⇒1 S2:0
wait(S1) S1:1⇒0 S2:0
counter++ counter:3
・・・
V−6 | 目次 | V−8 |