マルチスレッドのプログラミング

簡単なスレッドの例

例 2–1 では、あるスレッドが最上位の手続きを実行し、手続き fetch() を実行する補助スレッドを生成します。fetch() 手続きは複雑なデータベース検索を行うため、処理に多少時間がかかります。

メインスレッドでは検索結果も必要ですが、その間に行うべき処理があります。そこで、こうした必要な処理を行なってから、pthread_join() で補助スレッドの終了を待ちます。

新しいスレッドへの引数 pbe がスタックパラメータとして渡されます。これが可能なのは、メインスレッドが自分の子スレッドの終了を待つからです。しかし、通常は、malloc でヒープから領域を割り当てる方法をお勧めします。スレッドのスタック領域にアドレスを渡す方法だと、スレッドが終了したときアドレスが無効になったり、割り当て直されたりする可能性があります。


例 2–1 簡単なスレッドプログラム

void mainline (...)
{
        struct phonebookentry *pbe;
        pthread_attr_t tattr;
        pthread_t helper;
        void *status;

        pthread_create(&helper, NULL, fetch, &pbe);

            /* do something else for a while */

        pthread_join(helper, &status);
        /* it's now safe to use result */
}

void *fetch(struct phonebookentry *arg)
{
        struct phonebookentry *npbe;
        /* fetch value from a database */

        npbe = search (prog_name)
            if (npbe != NULL)
                *arg = *npbe;
        pthread_exit(0);
}   

struct phonebookentry {
        char name[64];
        char phonenumber[32];
        char flags[16];
}