POSIX thread (pthread) libraries: create(), join()

Jin Hur·2022년 1월 5일
0
post-thumbnail

reference: "Mastering C++ Multithreading" / 마야 포쉬

pthreads 쓰레드 관리

pthread_ 또는 pthread_attr_로 시작하는 모든 함수가 여기에 해당한다. 이들 함수 모두는 쓰레드 자체와 쓰레드 속성 객체에 적용된다.

pthreads를 이용한 쓰레드의 기본적 사용은 아래와 같다.

#include <pthread.h>
#include <stdlib.h>
#define NUM_THREADS 5

가장 중요한 pthreads 헤더는 pthread.h이다. 이것은 세마포어를 제외한 모든 것에 대한 접근을 제공한다.
시작하고자 하는 쓰레드의 개수를 상수로 정의한다.

void* worker(void* arg){
    int value = *((int*)arg);
    ...
    ...
    return 0;
}

간단한 worker 함수를 정의하고 이 함수를 새로운 쓰레드로 전달한다.

int main(int argc, char** argv){
    pthread_t threads[NUM_THREADS];
    int thread_args[NUM_THREADS];
    int result_code;
    
    for(unsigned int i = 0; i < NUM_THREADS; i++){
        threads_args[i] = i;
        // 쓰레드 생성 -> 수행
        result_code = pthread_create(&threads[i], 0, worker, (void*)&thread_args[i]);
    }

main 함수 내의 루프에서 모든 쓰레드를 생성한다.
각 쓰레드 인스턴스는 생성될 때 할당된 쓰레드 ID(첫 번째 인자)와 pthread_create() 함수가 반환하는 결과 코드(성공 시 0, result_code에 대입됨)를 갖는다. 쓰레드 ID는 이후의 호출에서 쓰레드를 참조하기 위한 핸들이다.

두 번째 인자는 pthread_attr_t 구조체 인스턴스이거나, 없으면 0이다. 이것은 초기 스택 크기와 같이 새로운 쓰레드의 특성 구성을 가능하게 해준다. 0이 전달되면 플랫폼과 구성별로 다른 기본 인자가 사용된다.

세 번째 인자는 새로운 쓰레드가 시작할 함수에 대한 포인터이다. 이 함수 포인터는 void 데이터 포인터(즉, 커스텀 데이터)를 반환하고 void 데이터 포인터를 받는 함수로 정의되어 있다.

(pthread_create 매개변수 정리)

  • 첫번째 매개변수(thread)는 쓰레드가 성공적으로 생성되었을 때 생성된 쓰레드를 식별하기 위해서 사용되는 쓰레드 식별자이다.
  • 두번째 매개변수(attr)는 쓰레드 특성을 지정하기 위해서 사용하며, 기본 쓰레드 특성을 이용하고자 할 경우에 NULL을 사용한다.
  • 세번째 매개변수(start_routine)는 분시켜서 실행할 쓰레드 함수이다.
  • 네번째 매개변수(arg)는 위 start_routine 쓰레드 함수의 매개변수로 넘겨진다.
for(int i = 0; i < NUM_THREADS; i++){
    result_code = pthread_join(threads[i], 0);
    exit(0);
}

이제 pthread_join() 함수를 사용해 각 작업자 쓰레드가 마치기를 대기한다(주 쓰레드가).
이 함수는 두 인자를 갖는데, 하나는 대기할 쓰레드의 ID와 함수 반환값을 위한 버퍼(또는 0)이다.

쓰레드를 관리하는 그 밖의 함수들

  • void pthread_exit(void *value_ptr)
  • int pthread_cancel(pthread_t thread)

참조하면 좋을 사이트
https://bitsoul.tistory.com/165?category=683199

0개의 댓글