CS/OS

7.Posix thread(Pthread)

Dortmoot 2022. 5. 25. 20:42

들어가기 전에 Process에 대해서 살펴보고 시작한다.

 

Process / Thread


일반적으로 Unix Process 는 Main() Function으로 부터 실행되는 Single Thread이다.

 

앞서 말하였듯이 Fork()를 통해 Process가 생성됨으로 Memory 및 File Descriptor를 Copy-on-Write 방식으로 자식에게 복사하여준다.

 

반면, Thread는 전역 Memory들은 서로 공유하고 있기 때문에 Process보다 속도가 빠르다.

Thread = Semi Process = Light weight Process 라고 불린다.

 

Posix Thread


일반적으로 PThread로 불리며, Thread를 지원하기 위한 C 표준 라이브러리 셋을 사용하여 동작시켜야 한다.
#Pthread Library Link
gcc -o thread thread.c -lpthread

동작되는 원리는 Main() -> Process(Single Thread) -> Master Thread -> Pthread_create() function 을 Call 함으로써, 새로운 Thread를 생성한다.

 

Thread Process

 

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

void* do_loop(void *data)
{
    int i;

    int me = *((int *)data);
    for (i = 0; i < 10; i++)
    {
        printf("%d - Got %d\n", me, i);
        sleep(1);
    }
}

int main()
{
    int       thr_id;
    pthread_t p_thread[3];
    int status;
    int a = 1;
    int b = 2;      
    int c = 3;      

    thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
    thr_id = pthread_create(&p_thread[1], NULL, do_loop, (void *)&b);
    thr_id = pthread_create(&p_thread[2], NULL, do_loop, (void *)&c);

    pthread_join(p_thread[0], (void **) &status);
    pthread_join(p_thread[1], (void **) &status);
    pthread_join(p_thread[2], (void **) &status);

    printf("programing is end\n");
    return 0;
}

 

위 코드를 살펴보면,  하나의 Process에서 총 3개의 Thread를 동작시키는 코드이다.

큰 흐름으로 보게 되면

1. pthread_create()를 호출함으로써 쓰레드가 생성된다.

2. 각각의 Thread는 do_loop Function을 실행하게 된다.

3. Thread의 작업이 종료되면, pthread_join을 통하여 다른 Thread가 종료되기 까지 대기

4. 모두 종료되었다면 Main Thread(Master Thread)가 종료되고 Process는 끝이 난다.

pthread_t 는 thread data 구조이다.

 

pthread_create( arg1 , arg2 , arg3 , arg4 )

arg1 = pthread_t 데이타 구조체
arg2 = thread type ( default = NULL )
arg3 = execute thread code
arg4 = thread parameter value

 

1부터 10까지 Print한 다음에 3개의 Thread가 종료되면 "programing is end" 후 Process exit() 될 것이다.

Process exit() 시 자식 Process가 Kill되어야 Parent Process가 Kill 되듯이 Thread도 Master Thread 하위의 Thread가 종료되어야만 Kill이 가능하다.

 

pthread_join

Master Thread는 pthread_join 에 명시된 쓰레드가 종료할때까지 sleep 된다.
모든 쓰레드가 종료하기 전에 부모쓰레드가 종료하는 사태를 막기 위해서 사용된다.

후에 pthread_join을 wake하게 되면, Thread에 할당된 Resource들을 Free 시켜 준다.

 

 

 

 

 

Reference

http://tibero1.blogspot.com/2014/12/pthread.html

 

쓰레드란?, pthread 예제

쓰레드는 무엇이며, 왜 이용하는가 쓰레드는 세미(semi)프로세스, 혹은 Light Weight 프로세스라고 불리우며, 여러개의 클라이언트를 처리하는 서버/클라이언트 모델의 서버프로그래밍 작업을 위해

tibero1.blogspot.com