10
2月
2007

スレッドの生成

まずはスレッドを生成してみる.
pthread_create
サンプル

pthread_create

スレッドを生成するには,pthread_create関数を呼び出す.
#include <pthread.h>

int  pthread_create(pthread_t  *  thread,
                    pthread_attr_t * attr,
                    void * (*start_routine)(void *),
                    void * arg);
各引数は以下のようになっている.
thread
pthread_create呼び出しによって設定される,同関数の出力項目である. pthread_create呼び出し元から生成したスレッドに対して何か処理をする際のスレッド識別情報である.
attr
生成するスレッドに付加する属性である. スレッド属性のリストはpthread_attr_initのmanpageに記述されているが,何だか難しそうな項目が並んでいるので,本ページのサンプルではNULLを設定しておく(※).
start_routine
生成されたスレッドが最初に処理を始める関数へのポインタ. 上記のとおり,この関数はvoidポインタを引数にとり,voidポインタを返す.
arg
生成されたスレッドがstart_routineを実行する際に渡される引数.
pthread_createが0かエラーコードが設定されている.
※ NULLを設定すると,各属性はデフォルトになるらしい.

サンプル

pthread_createを実行するサンプルを以下に示す.

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

/*
 * スレッドパラメータ格納用
 */
typedef struct {
  char printVal;
  int interval;
} MY_THREAD_ARG;

/*
 * スレッドイニシャル関数
 */
void *myThread(void *arg)
{
  MY_THREAD_ARG *my_thread_arg =(MY_THREAD_ARG*)arg;

  while(1) {
    fprintf(stderr,"%c", my_thread_arg->printVal);
    sleep(my_thread_arg->interval);
  }

  return NULL;
}

int main(int argc,char *argv[])
{
  int status;

  // スレッドa用のパラメータ
  pthread_t thread_a;
  MY_THREAD_ARG thread_a_arg;
  thread_a_arg.printVal = 'a';
  thread_a_arg.interval = 1;

  // スレッドb用のパラメータ
  pthread_t thread_b;
  MY_THREAD_ARG thread_b_arg;
  thread_b_arg.printVal = 'b';
  thread_b_arg.interval = 2;

  // スレッドaを生成
  status=pthread_create(&thread_a, NULL, myThread, &thread_a_arg);
  if(status!=0){
    fprintf(stderr, "\n");
    fprintf(stderr,"failed to create thread_a");
    fprintf(stderr, "\n");
    exit(1);
  }

  // スレッドbを生成
  status=pthread_create(&thread_b, NULL, myThread, &thread_b_arg);
  if(status!=0){
    fprintf(stderr, "\n");
    fprintf(stderr,"failed to create thread_a");
    fprintf(stderr, "\n");
    exit(1);
  }

  // 適当時間待つ
  sleep(10);

  fprintf(stderr, "\n");

  return 0;
}

このサンプルでは,main関数にて二つのスレッドa,bを生成する.
  status=pthread_create(&thread;_a, NULL, myThread, &thread;_a_arg);
...
  status=pthread_create(&thread;_b, NULL, myThread, &thread;_b_arg);
生成されたスレッドはどちらも関数myThreadを実行する. スレッド識別情報thread_a,thread_bは今回は使用しない. このとき,関数myThreadの引数としてそれぞれthread_a_argとthread_b_argが渡される. これらの引数には異なる値が設定されており,関数myThreadの挙動に影響を与える. main関数の最後でsleepしているのは,main関数が終了してしまうと,スレッドも実行途中でも終了してしまうからである. ビルドの際には,
-lpthread
によってpthreadライブラリを指定する.
cc -g -Wall -lpthread create_thread.c -o create_thread
実行結果は以下.
$ ./create_thread 
ababaabaabaabaa
二つのスレッドは非同期に実行されるので,きわどい出力のタイミングは不定だが,大体1秒おきにスレッドaによって文字aが二つ,スレッドbによって文字bが一つ出力される.

You may also like...