Skip to content

Pthread create

pthread_create는 새로운 스레드를 생성한다. 새로운 스레드는 start_rutine함수를 arg인자를 넘기며 실행 및 생성된다. 생성된 스레드는 pthread_exit을 호출하거나 또는 start_rutine가 종료될 경우 제거된다. attr인자는 스레드와 관련된 특성을 지정하기 위한용도로 사용된다. 이에 대한 내용은 pthread_attr_init을 참고해야 한다. attr을 NULL로 할경우 기본 특성으로 지정된다. 리눅스에서의 스레드는 joinable과 non real-time스케쥴 정책을 기본특성으로 한다.

Syntax

int pthread_create(pthread_t * thread, 
    const pthread_attr_t * attr,
    void * (*start_routine)(void *), 
    void *arg);

Parameters:

thread

out

스레드 ID

attr

in

스레드 속성. (NULL일 경우 기본속성으로 설정된다)

start_routine

in

스레드가 작동될 함수포인터

arg

in, optional

스레드와 연결될 함수의 인자

Requirements:

Header

pthread.h

!Library

libpthread.o

성공할경우 스레드식별자인 thread에 쓰레드 식별번호(ID)를 저장하고, 0을 리턴한다. 실패했을경우 0 이 아닌 에러코드 값을 리턴한다. 만약 EAGAIN가 반환될 경우 스레드 생성을 위한 자원이 부족하거나, PTHREAD_THREADS_MAX를 초과할 경우 발생된다.

pthread 자원 해제

일반적으로 pthread_create를 통해서 쓰레드가 생성되고 다 사용된 쓰레드는 해당 쓰레드를 호출한 곳에서 pthread_join을 통하여 해당 쓰레드의 자원을 해제하여 종료하는 흐름을 가지고 있다. 만약 생성된 쓰레드를 pthread_join으로 처리하지 않는다면 아무리 쓰레드가 종료되었다고 해도 자원이 반환되지 않는다. 이렇게 남겨진 자원은 메모리릭으로 간주되기 때문에 pthread_join은 쓰레드간의 동기작업과 자원 해제를 위해 필수적이다. 하지만 pthread_join을 하지 않고도, 생성된 쓰레드가 종료될 때 알아서 자원을 시스템에게 반환하는 detach 옵션이 있다. 말그대로 독립적으로 운용하게 하라라는 의미로 생각되며 (물론 자원적인면에서만), detach 옵션을 주는 방법은 두가지가 있습니다.

첫 번째, pthread_create시 생성될 쓰레드 속성값에 detach를 설정하여 새로 생성될 쓰레드는 독립적으로 자원을 해제하도록 설정한다.

pthread_t thread;
pthread_attr_t attr;

if( pthread_attr_init(&attr) != 0 )
  return 1;
if( pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0 )
  return -1;
if( pthread_create(&thread,&attr, &test_thread, NULL ) != 0 )
  return -1;
if( pthread_attr_destroy(&attr) != 0 )
  return -1;

/*
 * while (1)
 * {
 *  main thread logic...
 * }
 */

두 번째, 이미 생성된 쓰레드에게 detach 옵션을 주어 독립적으로 자원을 반환 하도록 하는 방법.

if( pthread_create(&thread,&attr, &test_thread, NULL ) != 0 )
  return 1;
pthread_detach(thread);

참고적으로 첫 번째 방법을 추천한다. 쓰레드의 속성을 운용중에 변경되는것은 로직상의 혼란을 줄 수 있고, 거의 그럴일은 없겠지만 detach 옵션을 주기전에 이미 해당 쓰레드가 끝나버릴 가능성이 있다.

동기화와 관련된 문제

쓰레드는 main함수가 종료되면 자동으로 종료된다. 따라서 정상적인 처리를 위하여 main에서 스레드가 종료될 때까지 main의 종료를 기다려야 한다. 그때 pthread_join을 사용한다.

See also

Favorite site