「pthread 1つのスレッドを動かす」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「C言語のpthreadを使用して、スレッドを1つ作成し、スレッドの終了を待ちます。pthread_createでスレッドの作成・実行を行い、...」)
 
 
行44: 行44:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
#include <stdio.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#include <err.h>
 
 
#include <pthread.h>
 
#include <pthread.h>
 +
#include <err.h>
 +
#include <errno.h>
 +
#include <stdlib.h>
 +
#include <string.h>
  
 
void f1(void);
 
void f1(void);
  
int main(void)
+
int
 +
main(void)
 
{
 
{
 
         pthread_t thread1;
 
         pthread_t thread1;
行57: 行60:
 
         ret1 = pthread_create(&thread1,NULL,(void *)f1,NULL);
 
         ret1 = pthread_create(&thread1,NULL,(void *)f1,NULL);
 
         if (ret1 != 0) {
 
         if (ret1 != 0) {
                 err(EXIT_FAILURE, "can not create thread 1");
+
                 err(EXIT_FAILURE, "can not create thread 1: %s", strerror(ret1) );
 
         }
 
         }
  
         printf("execute pthread_join");
+
         printf("execute pthread_join\n");
 
         ret1 = pthread_join(thread1,NULL);
 
         ret1 = pthread_join(thread1,NULL);
 
         if (ret1 != 0) {
 
         if (ret1 != 0) {
                 err(EXIT_FAILURE, "can not join thread 1");
+
                 errc(EXIT_FAILURE, ret1, "can not join thread 1");
 
         }
 
         }
 
         printf("join\n");
 
         printf("join\n");
行69: 行72:
 
}
 
}
  
void f1(void)
+
void
 +
f1(void)
 
{
 
{
 
         size_t i;
 
         size_t i;

2014年5月11日 (日) 15:54時点における最新版

C言語のpthreadを使用して、スレッドを1つ作成し、スレッドの終了を待ちます。pthread_createでスレッドの作成・実行を行い、pthread_joinでスレッドの終了を待ちます。

概要

pthreadでスレッドを作成するには、pthread_createを使用します。 pthread_createの引数は、以下の通りです。

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

第3引数には、スレッドで実行する関数を渡します。

スレッドの終了を待つには、pthread_joinを使用します。

int
pthread_join(pthread_t thread, void **value_ptr);
forkとpthread
動作 forkモデル スレッドモデル
プロセス・スレッドの作成 fork pthread_create
プロセス・スレッドの終了を待つ wait,waitpid, wait4 pthread_join

pthread_createをしたらpthread_joinするかpthread_detachする

pthread_createでスレッドを作成した場合、joinもしくは、detachしなければなりません。 pthread_detachは、メインスレッドからスレッドを切り離す機能を提供します。

pthread_createで作ったスレッドが終了したとき、joinで終了を回収せずに、pthread_createだけを呼び出して、プログラムを動かしているとメモリリークします。

pthread1.c の例

この例で、joinせずにmainが終わるとpthread_createのスレッドの終了をまたずに、プログラム(スレッドも含め)が終了します。

ソースコード pthread1.c

#include <stdio.h>
#include <pthread.h>
#include <err.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
 
void f1(void);
 
int
main(void)
{
        pthread_t thread1;
        int ret1;
 
        ret1 = pthread_create(&thread1,NULL,(void *)f1,NULL);
        if (ret1 != 0) {
                err(EXIT_FAILURE, "can not create thread 1: %s", strerror(ret1) );
        }
 
        printf("execute pthread_join\n");
        ret1 = pthread_join(thread1,NULL);
        if (ret1 != 0) {
                errc(EXIT_FAILURE, ret1, "can not join thread 1");
        }
        printf("join\n");
        return 0;
}
 
void
f1(void)
{
        size_t i;
 
        for(i=0; i<4; i++){
                printf("Doing one thing\n");
        }
}

コンパイル

cc  -lpthread pthread1.c -o pthread1

実行例

% ./pthread1
execute pthread_join
Doing one thing
Doing one thing
Doing one thing
Doing one thing
join

関連項目