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 整数を用いよ。


Shinji KONO / Tue Dec 22 12:29:15 2009