메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Posix Threads: 두 판 사이의 차이

noriwiki
Pinkgo (토론 | 기여)
Pinkgo (토론 | 기여)
38번째 줄: 38번째 줄:


===Terminating Threads===
===Terminating Threads===
쓰레드는 다음 중 하나의 방식으로 종료된다:
* 최상위 쓰레드 루틴이 반환될 때, 암묵적으로 해당 쓰레드는 종료된다.<ref>해당 쓰레드들로부터 생성된 쓰레드들은 영향받지 않는다. 쓰레드 사이에는 부모-자식 관계가 없기 때문이다.</ref>
* <code>pthread_exit()</code> 함수를 호출하여 명시적으로 종료된다. 메인 쓰레드는


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">

2025년 5월 21일 (수) 04:29 판

상위 문서: Concurrent Programming

개요

Pthreads(Posix threads)는 C 프로그램에서 쓰레드(thread)를 조작하기 위한 표준적인 인터페이스이다. Pthreads는 프로그램이 쓰레드를 생성하고, 종료시키며, 수거할 수 있도록 하며, 또한 피어(peer) 쓰래드들과 데이터를 안전하게 공유하며, 시스템 상태 변화에 대해 피어들에게 알리도록 하는 약 60개 정도의 함수를 정의한다. 아래는 간단한 Pthreads 프로그램을 보여준다:

#include "csapp.h"
void *thread(void *vargp);

int main() {
    pthread_t tid;
    Pthread_create(&tid, NULL, thread, NULL);
    Pthread_join(tid, NULL);
    exit(0);
}
void *thread(void *vargp) { /* Thread routine */
    printf("Hello, world!\n");
    return NULL;
}

위에서 메인 쓰레드는 하나의 피어 쓰레드를 생성하고, 그 쓰레드가 종료할 때까지 기다린다. 피어 쓰레드는 "Hello, world!\n"을 출력하고 종료된다. 메인 쓰레드가 동료 쓰레드의 종료를 감지하면, exit을 호출하여 프로세스를 종료한다. 좀 더 자세히 살펴보면, 피어 쓰레드에서 사용되는 코드와 로컬 데이터는 쓰레드 루틴 내[1]에 캡슐화되어 있다. 2번째 줄에 있는 프로토타입이 보여주듯이, 각 쓰레드 루틴은 하나의 일반 포인터(generic pointer)를 입력으로 받고, 일반 포인터를 반환한다. 만약 여러 개의 인자를 쓰레드 루틴에 전달하고자 한다면, 인자들을 구조체에 넣고 그 구조체에 대한 포인터를 전달하면 된다. 마찬가지로, 쓰레드 루틴이 여러 값을 반환하게 만들고자 할 때에도 구조체에 대한 포인터를 반환하면 된다.

main 함수는 메인 쓰레드의 코드가 시작되는 부분을 포함한다. 메인 쓰레드는 지역 변수 tid를 선언하며, 이는 피어 쓰레드의 TID(Thread ID)를 저장하는데 사용된다. 그리고 메인 쓰레드는 pthread_create() 함수를 호출하여 새로운 피어 쓰레드를 호출한다. 해당 함수의 호출이 리턴되면, 메인 쓰레드와 새롭게 생성된 피어 쓰레드는 동시에 실행되며, tid에는 피어 프로세스의 TID가 저장된다. 그리고 메인 쓰레드는 pthread_join() 함수를 호출하여 피어 쓰레드가 종료될 때까지 기다린다. 마지막으로, 메인 쓰레드는 exit()을 호출하여 프로세스를 종료한다.

Creating Threads

쓰레드는 pthread_create() 함수를 호출하여 다른 쓰레드를 생성한다:

#include <pthread.h>
typedef void *(func)(void *);
//반환값: 성공 시 0, 오류시 0이 아닌 값
int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg);

pthread_create() 함수는 새로운 쓰레드를 생성하고, 새 쓰레드의 컨텍스트(context)에서 쓰레드 루틴 f를 arg 인자를 가지고 생성한다. 또한 attr 인자는 새로 생성된 쓰레드의 기본 속성을 변경하는데 사용되며, 기본적으로는 NULL을 사용한다. pthread_create()가 반환되면, 인자인 tid에는 새로 생성된 쓰레드의 TID가 저장된다. 이때 각 쓰레드는 아래와 같이 pthread_self 함수를 호출하여 자신의 TID를 알아낼 수 있다.

#include <pthread.h>
//반환값: 호출자의 TID
pthread_t pthread_self(void);

Terminating Threads

쓰레드는 다음 중 하나의 방식으로 종료된다:

  • 최상위 쓰레드 루틴이 반환될 때, 암묵적으로 해당 쓰레드는 종료된다.[2]
  • pthread_exit() 함수를 호출하여 명시적으로 종료된다. 메인 쓰레드는

각주

  1. void *thread(void *vargp);에 해당한다.
  2. 해당 쓰레드들로부터 생성된 쓰레드들은 영향받지 않는다. 쓰레드 사이에는 부모-자식 관계가 없기 때문이다.