Pthreadによるプロセス間の同期・通信
Menu Menu
1. 目的
POSIX Pthread を使って並列処理を行う。そのために Thread Pool と Synchronized Queue を作成する。
Pthreads の Thread Pool の作成
arg[i] = (void*)malloc(sizeof(ThreadData); pthread_create(&thread[i], NULL, &thread_pool_main, &arg[i]);等を用いて、N個のスレッドを作成し、それを管理するスレッド一つを用意する。(main そのままでも良い)void *arg[]; pthread_t thread[]; などは、malloc を使って動的に作成すること。
管理スレッド側から、ある程度時間がたったら(sleepを使う)、管理しているスレッドを殺す仕組みをいれる。 pthread_kill を使用する。
ThreadPool *pool = createThreadPool(SIZE_OF_THREAD_POOL);
Synchronized Queue の作成
管理スレッドから Thread Pool へ通信する Synchronized Queue を作成する。(Java の java.util.concurrent を参考)
計数 セマフォ を参考にSynchronized Queue を作成する。
QueueData *data = ... SyncQueue *q = createSynchronizedQueue(SIZE_OF_QUEUE); q->put(data); ... QueueData recv = q->poll();などのAPIを持つ Queue を作成せよ。(C++ を用いても良い)
並列処理
作成した、Thread Pool 間で SynchronizedQueue を共有し、管理スレッドから仕事を配布する。
双子素数を決まった個数求める例題を作成せよ。
答えは、メインスレッドにSynchronized Queue を用いて集める。
これを用いて、並列処理の効果を測定せよ。(time を用いる)
すべてのスレッドを終了させるようにせよ。この時に、pthrea_kill を使用してはならない。
双子素数の個数は、1分程度で計算が終るように調整せよ。
必要なら 64bit 整数を用いよ。