例 2–1 では、あるスレッドが最上位の手続きを実行し、手続き fetch() を実行する補助スレッドを生成します。手続き fetch() は複雑なデータベース検索を行い、処理に多少時間がかかります。
メインスレッドでは検索結果も必要ですが、その間に行うべき処理があります。そこで必要な処理を行なってから、pthread_join() で補助スレッドの終了を待ちます。
新しいスレッドへの引数 pbe がスタックパラメータとして渡されます。これが可能なのは、メインスレッドが自分の子スレッドの終了を待つからです。通常は、malloc(3C) でヒープから領域を割り当てる方が、スレッドのスタック領域で (スレッドが終了した場合なくなるか、再度割り当てられる) アドレスを受け渡すよりもよいでしょう。
void mainline (...)
{
struct phonebookentry *pbe;
pthread_attr_t tattr;
pthread_t helper;
void *status;
pthread_create(&helper, NULL, fetch, &pbe);
/* この間、他の処理を行う */
pthread_join(helper, &status);
/* ここでは結果を確実に使用できる */
}
void *fetch(struct phonebookentry *arg)
{
struct phonebookentry *npbe;
/* データベースから値を取り出す */
npbe = search (prog_name)
if (npbe != NULL)
*arg = *npbe;
pthread_exit(0);
}
struct phonebookentry {
char name[64];
char phonenumber[32];
char flags[16];
}
|