C에서 pthread_join 함수 사용
이 기사에서는 C에서pthread_join
함수를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.
pthread_join
함수를 사용하여 스레드 종료 대기
프로그램은pthread_create
함수를 사용하여 스레드를 작성하고 일반적으로pthread_join
함수로 종료 될 때까지 기다립니다. pthread_join
은 대기 스레드를 지정하는 스레드 ID와 지정된 스레드의 종료 상태를 저장할 수있는void*
에 대한 포인터의 두 인수 만 사용합니다. 사용자가 대기중인 스레드의 종료 코드를 검색하지 않으려면NULL
값을 두 번째 인수로 전달해야합니다. 다음 예에서는 8 개의 스레드를 생성하고 각 스레드에서printHello
함수를 실행하는 프로그램을 보여줍니다. 그런 다음 호출 스레드는 루프에서pthread_join
호출이있는 모든 스레드를 기다립니다. 또한 스레드의 종료 상태 코드를retval
변수에 저장하고int
로 캐스트하여 해당 값을 인쇄합니다. 하지만 스레드가 취소되면PTHREAD_CANCELED
값이retval
주소에 배치됩니다.
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#ifndef NUM_THREADS
#define NUM_THREADS 8
#endif
void *printHello(void *threadid) {
long tid;
tid = (long)threadid;
printf("Hello from thread %ld, pthread ID - %lu\n", tid, pthread_self());
return NULL;
}
int main(int argc, char const *argv[]) {
pthread_t threads[NUM_THREADS];
int rc;
long t;
for (t = 0; t < NUM_THREADS; t++) {
rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
if (rc) {
printf("ERORR; return code from pthread_create() is %d\n", rc);
exit(EXIT_FAILURE);
}
}
int ret;
for (t = 0; t < NUM_THREADS; t++) {
void *retval;
ret = pthread_join(threads[t], &retval);
if (retval == PTHREAD_CANCELED)
printf("The thread was canceled - ");
else
printf("Returned value %d - ", (int)retval);
}
pthread_exit(NULL);
}
출력:
Hello from thread 0, pthread ID - 140716669929216
Hello from thread 1, pthread ID - 140716661536512
Hello from thread 2, pthread ID - 140716653143808
Hello from thread 3, pthread ID - 140716644751104
Hello from thread 5, pthread ID - 140716627965696
Hello from thread 4, pthread ID - 140716636358400
Hello from thread 6, pthread ID - 140716550387456
Hello from thread 7, pthread ID - 140716541994752
pthread_join
함수 반환 값을 사용하여 오류 확인
pthread_join
함수는errno
전역 변수를 설정하는 함수와 달리 다른 오류 코드도 나타내는 정수 값을 리턴합니다. 호출이 성공하면 반환 값은0
이며 지정된 스레드가 종료되었음을 보장합니다. 리턴 된 정수가EDEADLK
와 같으면 교착 상태가 감지되었음을보고합니다. EINVAL
값이 반환되면 주어진 스레드는 조인 할 수 없으며 값이ESRCH
와 같으면 주어진 스레드 ID를 찾을 수 없음을 나타냅니다. 이 경우switch
문을 구현하여 각 케이스를 확인하고 해당 메시지를stdout
에 인쇄합니다.
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#ifndef NUM_THREADS
#define NUM_THREADS 8
#endif
void *printHello(void *threadid) {
long tid;
tid = (long)threadid;
printf("Hello from thread %ld, pthread ID - %lu\n", tid, pthread_self());
return NULL;
}
int main(int argc, char const *argv[]) {
pthread_t threads[NUM_THREADS];
int rc;
long t;
for (t = 0; t < NUM_THREADS; t++) {
rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
if (rc) {
printf("ERORR; return code from pthread_create() is %d\n", rc);
exit(EXIT_FAILURE);
}
}
int ret;
for (t = 0; t < NUM_THREADS; t++) {
void *retval;
ret = pthread_join(threads[t], &retval);
if (retval == PTHREAD_CANCELED)
printf("The thread was canceled - ");
else
printf("Returned value %d - ", (int)retval);
switch (ret) {
case 0:
printf("The thread joined successfully\n");
break;
case EDEADLK:
printf("Deadlock detected\n");
break;
case EINVAL:
printf("The thread is not joinable\n");
break;
case ESRCH:
printf("No thread with given ID is found\n");
break;
default:
printf("Error occurred when joining the thread\n");
}
}
pthread_exit(NULL);
}
출력:
Hello from thread 0, pthread ID - 140082577512192
Hello from thread 1, pthread ID - 140082569119488
Hello from thread 3, pthread ID - 140082552334080
Hello from thread 5, pthread ID - 140082535548672
Hello from thread 6, pthread ID - 140082527155968
Returned value 0 - The thread joined successfully
Hello from thread 4, pthread ID - 140082543941376
Hello from thread 2, pthread ID - 140082560726784
Returned value 0 - The thread joined successfully
Returned value 0 - The thread joined successfully
Returned value 0 - The thread joined successfully
Hello from thread 7, pthread ID - 140082518763264
Returned value 0 - The thread joined successfully
Returned value 0 - The thread joined successfully
Returned value 0 - The thread joined successfully
Returned value 0 - The thread joined successfully
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook