C에서 pthread_join 함수 사용

Jinku Hu 2023년10월12일
  1. pthread_join함수를 사용하여 스레드 종료 대기
  2. pthread_join함수 반환 값을 사용하여 오류 확인
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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C Thread