並行プログラミング

スレッド

問1-1: スレッドの作成

スレッドを2つ作成し、それぞれのスレッドから以下の出力をするプログラムを書きなさい。

$ ./thread_1
Hello, World! from thread #1
Hello, World! from thread #2

#1と#2の順番は異なってOK。

問1-2: 共有メモリにアクセス

変数int xを用意して、0で初期化しなさい。

その後、変数xを書き換えるwriterスレッドと、それを読み取るreaderスレッドを作成しなさい。 writerスレッドは、2秒間隔で値の書き換えを行いなさい。 readerスレッドはwhileループで変数を読み取り、変更を検知したらその値を出力しなさい。

以下の出力を生成しなさい。

$ ./thread_2
#Reader: Read x = 0
#Writer: Set x = 10
#Reader: Read x = 10
#Writer: Set x = 20
#Reader: Read x = 20

問1-3: 共有メモリにアクセス2

変数int countを用意を用意しなさい。 そしてスレッドを5つ作り、10000回のforループで1づつ加算しなさい。 最後に、メインスレッドが合計結果を出力しなさい。 結果は50000になるかな?

(コンパイルするときに、最適化レベルを0にしてください。)

$ ./thread_3
Sum: ???

問1-4: 排他制御

問1-3を改良し、排他制御をして、合計値が50000になるようにしてください。

$ ./thread_4
Sum: 50000

プロセス

問1-5: プロセスの作成

forkシステムコールでプロセスを2つ作成し、それぞれのプロセスから以下の出力をするプログラムを書きなさい。

$ ./process_1
Hello, World! from process #1
Hello, World! from process #2

#1と#2の順番は異なってOK。

問1-6 プロセス間のメッセージング

値を送るproducerプロセスと、値を読み取るconsumerプロセスを作成しなさい。 また、pipeシステムコールでパイプを作成し、値を送受信しなさい。

$ ./process_2
#Producer: Send Hello
#Consumer: Recv Hello
#Producer: Send World
#Consumer: Recv World