[C, C++] 리눅스에서 pthread로 스레드 구현

목적

a와 b를 각각 무한히 출력하는 가장 기본적인 스레드 A와 B를 구현한다.

스레드 구현

헤더파일

#include <pthread.h>
#include <stdio.h>

스레드 구현부

void *threadA()
{
    while(1)
    {
        printf("a\n");   
    }
}

void *threadB()
{
    while(1)
    {
        printf("b\n");   
    }
}

메인함수

pthread_create

// 리턴값 = pthread_create(스레드 아이디, 스레드 속성, 실행 함수, 스레드 함수 인자)
int pthread_create( pthread_t *th_id, const pthread_attr_t *attr, void* 함수명, void *arg );
  • 스레드 생성 함수
  • pthread_create 함수의 리턴값이 0이면 성공, 아니면 실패다.
  • 아래 예제에서는 스레드 속성과 스레드 함수 인자를 지정하지 않기 때문에 NULL로 둔다

pthread_join

// 리턴값 = pthread_join(스레드 아이디, 스레드 리턴 값)
int pthread_join( pthread_t th_id, void** thread_return );
  • 스레드 종료시 자원을 회수하는 함수
  • pthread_join 함수의 리턴값이 0이면 성공, 아니면 실패다.
  • prhead_create를 사용한 후 pthread_join, pthread_exit, pthread_detach와 같은 스레드 종료 함수를 호출하지 않을경우, 스레드 실행 중에 main이 종료되어 에러가 발생한다.
  • 스레드 함수의 리턴값을 thread_return으로 받아올 수 있으나 아래 예제에서는 스레드 함수의 리턴값이 없기 때문에 NULL로 둔다.
int main()
{
    pthread_t tA, tB; // 스레드 아이디
    int threadErr = 0;

    threadErr = pthread_create(&tA, NULL, threadA, NULL);
    if(threadErr != 0)
    {
        printf("thread A create fail : %d\n", threadErr);
    }

    threadErr = pthread_create(&tB, NULL, threadB, NULL);
    if(threadErr != 0)
    {
        printf("thread B create fail : %d\n", threadErr);
    }

    threadErr = pthread_join(tA, NULL);
    if(threadErr != 0)
    {
        printf("thread A Join fail : %d\n", threadErr);
    }

    threadErr = pthread_join(tB, NULL);
    if(threadErr != 0)
    {
        printf("thread B Join fail : %d\n", threadErr);
    }

    return 0;
}

전체 코드

#include <pthread.h>
#include <stdio.h>

void *threadA()
{
    while(1)
    {
        printf("a\n");   
    }
}

void *threadB()
{
    while(1)
    {
        printf("b\n");   
    }
}


int main()
{
    pthread_t tA, tB;
    int threadErr = 0;

    threadErr = pthread_create(&tA, NULL, threadA, NULL);
    if(threadErr != 0)
    {
        printf("thread A create fail : %d\n", threadErr);
    }

    threadErr = pthread_create(&tB, NULL, threadB, NULL);
    if(threadErr != 0)
    {
        printf("thread B create fail : %d\n", threadErr);
    }

    threadErr = pthread_join(tA, NULL);
    if(threadErr != 0)
    {
        printf("thread A Join fail : %d\n", threadErr);
    }

    threadErr = pthread_join(tB, NULL);
    if(threadErr != 0)
    {
        printf("thread B Join fail : %d\n", threadErr);
    }

    return 0;
}

Leave a Comment