Posix Threads
상위 문서: 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);
각주
- ↑ void *thread(void *vargp);에 해당한다.