WOODWOOD77777のHP

(2007/12/28)・・・更新(トラブルシューティング追加)

Pthreadプログラミング(1)
新しいスレッドを作成する

2005/01/18 全面更新
2005/01/16 タイトル変更
2005/12/29 アップロード

次のページ:Pthreadプログラミング(2) DETACHED属性の利点と問題点の解決


Contents

サンプルプログラム(pthread01.c)
pthread_create()の概要

コメント:よりシンプル(基本的)なものにプログラムを変更しました。というかこっちをアップロードしていたはずなんだけど、いつのまにか入れ替わっていたような・・・(^^);;
すんませんm(_ _)m
次のページを追加したので参照してみて下さい。
2006/01/18

コメント:pthreadについては、自分の中でも、最も重点を置いています。他の記事も更新しようと思っていますので、なかなか進みませんが、少しずつ記事を追加していきますので、たまに訪れてみてください。2006/01/14


サンプルプログラム(pthread01.c)新しいスレッドを作成するには、pthread_create()関数を使います。 以下のサンプルプログラムは、新しいスレッドを作成して、スレッドが終了するのを待機するだけのシンプルなプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

void *thread_func(void *param)
{
  int pid;
  pthread_t thread_id;
  thread_id = pthread_self();
  fprintf(stderr , "thread_func called\n");
  fprintf(stderr , "  thread ID = %ld\n" , thread_id);
  pid = getpid();
  fprintf(stderr , "  2:pid=%d\n" , pid);
}

int main(int argc, char *argv[])
{
  pthread_t thread;
  int pid;

  fprintf(stderr , "---Program start---\n");
  pid = getpid();
  fprintf(stderr , "1:pid = %d\n" , pid);
  if(pthread_create(&thread , NULL , thread_func , NULL) !=0)  /*2番目の引数にNULLを指定することによりスレッドの属性にデフォルトとする*/
        perror("pthread_create()");
  fprintf(stderr , "Next line of pthread_create() called. thread ID=%ld\n" , thread);
  pthread_join(thread , NULL);  /*thread_func()スレッドが終了するのを待機する。thread_func()スレッドが終了していたら、この関数はすぐに戻る*/
  
  return EXIT_SUCCESS;
}


実行結果
---Program start---
1:pid = 25965
thread_func called
  thread ID = 1026
  2:pid=25967
Next line of pthread_create() called. thread ID=1026
------------


新しい、スレッドが作成され、新しいプロセスIDが与えられていることが確認できます。
しかし、マルチプロセス(fork())が、プロセスの数だけメモリ空間を消費するのに対し、マルチスレッドではメモリ空間は共有します。
fork()と違い、thread_func()から制御が戻った時点で、スレッドは破棄されます。
pthread_join(thread , NULL);で、threadが指し示すスレッドが終了するまで、待機します。
threadが指し示すスレッドが既に終了していた場合、この関数はすぐに戻ります。


pthread_create()の概要

インクルードファイル
#include <pthread.h>

書式
int pthread_create(pthread_t * thread, pthread_attr_t *
attr, void * (*start_routine)(void *), void * arg);

ライブラリファイル
libpthread.a(環境によって名前が違います)を追加する。

pthread_create()関数はargを引数として、start_routine()関数を呼び出す新しいスレッドを作成します。
pthread_create()関数が正常にスレッドを生成したら、threadが指す位置に新しいスレッドIDが格納され、pthred_create()は0を返します。
スレッドの生成に失敗した場合、pthread_create()は、errno.hで記述されているエラーコードを返します。
attr引数は、新しいスレッドの属性を変更するために使用されます。
attrがNULLの場合は、デフォルトの属性が適用されます。
attrはpthread_attr_init()関数で初期化することができます。
pthread_attr_init()関数を呼び出した時は、pthread_attr_destroy()関数で属性構造体を開放するのを忘れないようにしましょう。
Linuxでは、pthread_attr_destroy()関数は何もコードを実行しません。