[C] pthread
12321 ワード
pthread_create
新しいねじを生成します.
ねじアトリビュートオブジェクト
ネジの作成に成功すると、生成されたネジIDは
生成されたスレッドは、パラメータ
パラメータ 戻り値成功時:0 を返します.失敗時:エラー番号 pthread_join
スレッドが終了するのを待って、スレッドが終了するとリソースが解放されます.もう終わったthreadは待たない. 戻り値成功時:0 を返します.失敗時:エラー番号 pthread_detatch
親スレッドから分離され、親スレッドはスレッドを待たない.
独立したスレッドは、終了時に自動的にリソースを解放します.
パラメータthread:ねじ識別値(一意のID) 戻り値成功時:0 を返します.失敗時:エラー番号 例
新しいねじを生成します.
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
ねじアトリビュートattr
に基づいて新しいねじを作成します.ねじアトリビュートオブジェクト
attr
がNULL
の場合、デフォルトのねじアトリビュートを使用してねじが作成されます.ネジの作成に成功すると、生成されたネジ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
でこのパラメータを変換して使用します.スレッドが終了するのを待って、スレッドが終了するとリソースが解放されます.もう終わったthreadは待たない.
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
パラメータstart_routine
:Thread識別値(一意のアイデンティティ)thread
:value_ptr
のねじ関数(pthread_create
)の戻り値.親スレッドから分離され、親スレッドはスレッドを待たない.
独立したスレッドは、終了時に自動的にリソースを解放します.
#include <pthread.h>
int pthread_detach(pthread_t thread)
独立してThreedを操作したい場合に使用します.スレッドが終了すると、独立した操作ではなくリソースが返されます.(pthread createのみを使用してスレッドを作成すると、スレッドが完了してもリソースは返されません.)パラメータ
#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;
}
Reference
この問題について([C] pthread), 我々は、より多くの情報をここで見つけました https://velog.io/@t1won/C-pthreadテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol