[C] pthread

12321 ワード

pthread_create
新しいねじを生成します.
#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
		   void *(*start_routine)(void *), void *arg);
ねじアトリビュートattrに基づいて新しいねじを作成します.
ねじアトリビュートオブジェクトattrNULLの場合、デフォルトのねじアトリビュートを使用してねじが作成されます.
ネジの作成に成功すると、生成されたネジIDはthreadに保存されます.
生成されたスレッドは、パラメータstart_routineを使用して実行されます.argが返されると、内部でstart_routine関数が呼び出され、スレッドが終了します.
パラメータ
  • pthread_exit():Thread ID値(一意ID)-関数が正常に呼び出された場合、ここにthread idが保存されます.このパラメータを使用して得られた値は、threadと同じ関数を使用できます.
  • pthread_join:pthreadオプション(オプションがない場合はNULL)-ねじのプロパティを定義します.デフォルトはNULLです.ねじのプロパティを指定する場合は、attr関数に初期化する必要があります.
  • pthread_attr_init:スレッド関数(スレッド関数)-スレッドを石関数とするポインタをパラメータとする
  • start_routine:スレッド関数で使用されるパラメータ(arg型ですが、スレッド関数で使用される)-void *に渡すパラメータです.start_routineでこのパラメータを変換して使用します.
  • 戻り値
  • 成功時:0
  • を返します.
  • 失敗時:エラー番号
  • pthread_join
    スレッドが終了するのを待って、スレッドが終了するとリソースが解放されます.もう終わったthreadは待たない.
    #include <pthread.h>
    
    int pthread_join(pthread_t thread, void **value_ptr);
    パラメータ
  • start_routine:Thread識別値(一意のアイデンティティ)
  • thread:value_ptrのねじ関数(pthread_create)の戻り値.
  • 戻り値
  • 成功時:0
  • を返します.
  • 失敗時:エラー番号
  • pthread_detatch
    親スレッドから分離され、親スレッドはスレッドを待たない.
    独立したスレッドは、終了時に自動的にリソースを解放します.
    #include <pthread.h>
    
    int pthread_detach(pthread_t thread)
    独立してThreedを操作したい場合に使用します.スレッドが終了すると、独立した操作ではなくリソースが返されます.(pthread createのみを使用してスレッドを作成すると、スレッドが完了してもリソースは返されません.)
    パラメータ
  • thread:ねじ識別値(一意のID)
  • 戻り値
  • 成功時:0
  • を返します.
  • 失敗時:エラー番号
  • #include <stdio.h>
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #include <string.h>
    #include <errno.h>
    
    void *routine(void *thread_number)
    {
    	for (int i = 0; i < 5; i++)
    	{
    		usleep(1000 * 1000);
    		i++;
    		printf("Thread[%d]: Wating %d Seconds.\n", *(int *)thread_number, i);
    	}
    	printf("%d Thread end\n", *(int *)thread_number);
    	return (thread_number);
    }
    
    int main(void)
    {
    	pthread_t thread1;
    	pthread_t thread2;
    	int number1;
    	int number2;
    	void *ret;
    
    	number1 = 1;
    	number2 = 2;
    
    	if (pthread_create(&thread1, NULL, routine, (void *)&number1))
    	{
    		fprintf(stderr, "Thread(1): pthread_create error: %s", strerror(errno));
    		return (errno);
    	}
    	if (pthread_create(&thread2, NULL, routine, (void *)&number2))
    	{
    		fprintf(stderr, "Thread(2): pthread_create error: %s", strerror(errno));
    		return (errno);
    	}
    
    	printf("detach thread2\n");
    	pthread_detach(thread2); // main thread에서 join 하지 않아도 알아서 진행하고 종료된다.
    	printf("waiting for a thread\n");
    	pthread_join(thread1, &ret); // thread1을 대기한다. routine의 값을 ret에 넣어준다
    	printf("main end: %d\n", *(int *)ret);
    	return 0;
    }