スレッド作成

Pthreadは普段から使用するので自分のために今後もまとめていく。


Pthreadのドキュメントはpthreads(7)から読んで行くと良い。
JM:http://www.linux.or.jp/JM/html/LDP_man-pages/man7/pthreads.7.html
die.net:http://www.die.net/doc/linux/man/man7/pthreads.7.html


とりあえず基本的なスレッド作成から。

void *hoge(void *arg){
  printf("%s():%ld start\n", __func__, pthread_self());

  sleep(5);

  printf("%s():%ld end\n", __func__, pthread_self());

  return NULL;
}

int main(void){
  pthread_t thr;

  pthread_create(&thr, NULL, hoge, NULL);

  pthread_join(thr, NULL);

  return 0;
}


スレッドが1つだけならば問題がないが、複数のスレッドを作成する場合
pthread_join()では問題になる。

void *hoge(void *arg){
  printf("%s():%ld start\n", __func__, pthread_self());

  sleep(5);

  printf("%s():%ld end\n", __func__, pthread_self());

  return NULL;
}

void *hoge1(void *arg){
  printf("%s():%ld start\n", __func__, pthread_self());

  while(1){
    printf("%ld doing\n", pthread_self());
    sleep(1);
  }

  printf("%s():%ld end\n", __func__, pthread_self());

  return NULL;
}

int main(void){
  pthread_t thr, thr1;

  pthread_create(&thr, NULL, hoge, NULL);
  pthread_create(&thr1, NULL, hoge1, NULL);

  pthread_join(thr1, NULL);
  pthread_join(thr, NULL);

  return 0;
}


上記のような場合、hoge()スレッドが先に終了する。
しかしpthread_join()で待っているのはhoge1()、hoge()の順番。
この場合hoge1()が無限ループのため終了しないのでhoge()の資源が回収されない。


このサンプル程度では問題ないがスレッド数が多くなると問題となる。
早い話がメモリーリークが起きる。
自分の場合はこの問題を回避するために、できるだけデタッチ属性としている。
デタッチにすると資源を即座に解放することを保証する。