# include <pthread.h>

  • pthread_craete
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 이 함수는 현재 실행되고 있는 프로세스에서 새로운 스레드를 생성하는 함수이다. 1. thread : 성공적으로 함수가 호출되면 이곳에 thread ID가 저장된다. 이 인자로 넘어온 값을 통해서 pthread_join과 같은 함수를 사용할 수 있다. 2. attr : 스레드의 특성을 정의합니다. 기본적으로 NULL을 지정한다. 만약 스레드의 속성을 지정하려고 한다면 pthread_attr_init등의 함수로 초기화해야한다 3. start_routine : 어떤 로직을 할지 함수 포인터를 매개변수로 받는다. 4. arg : start_routine에 전달될 인자를 말한다. start_routine에서 이 인자를 변환하여 사용한다 // return 성공: 0 실패: error number EAGAIN, EINVAL, EPERM linux에서 쓰레드의 기본 스택사이즈(stack size)는 2 megabyte이다. 쓰레드 스택사이즈를 바꾸려면 pthread_attr_setstacksize(3) 함수로 attr 인수에 스택사이즈를 명시적으로 설정할수 있다. 현재 시스템의 thread stack size를 확인하려면 'ulimit -s'로 확인할 수 있다. gcc pthread.c -pthread -o pthread
  • pthread_join
int pthread_join(pthread_t thread, void **retval); pthread_join은 스레드를 생성했던 thread를 끝날때까지 기다려준다. 만약 thread가 이미 종료되었다면 즉시 리턴한다. 1. thread : join하려고 하는 thread를 명시해준다. 2. retval : pthread_create에서 start_routine이 반환하는 반환값을 여기에 저장한다. 만약 성공적으로 호출이 되었다면 0을 반환한다. 실패시 에러 넘버를 반환하게 된다. 실패시에는 좀비 스레드가 되고 이 좀비 스레드는 자원을 소모하게 되어 더이상 스레드를 생성할 수 없게 된다.
  • pthread_detach
int pthread_detach(pthread_t thread); 독립적인 동작을 하는 대신에 스레드가 끝이나면 반드시 자원을 반환시켜야한다. pthread_create만으로 스레드를 생성하면 루틴이 끝나서도 자원이 반환되지 않는다. 그러한 문제점을 해결해주는 함수가 바로 pthread_detach이다.
  • pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 첫번째 인자는 mutex, 두번째인자는 이 mutex의 속성을 주는데, 기본적으로 NULL을 사용한다.
  • pthread_mutex_lock, pthread_mutex_unlock
int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); 이 두 함수는 mutex를 이용하여 임계 구역을 진입할때 그 코드 구역을 잠그고 다시 임계 구역이 끝날때 다시 풀어 다음 스레드가 진입할 수 있도록 한다. 한 가지 중요한 점은 pthread_mutex_lock이 어떤 스레드에서 호출되어 lock이 걸렸을때 다른 스레드가 임계구역에 진입하기 위해서 pthread_mutex_lock을 호출했다면 그 스레드는 이 전의 스레드가 임계 구역을 나올때까지, 즉, pthread_mutex_unlock을 할때까지 기다려야한다.
  • pthread_mutex_destroy
int pthread_mutex_destroy(pthread_mutex_t *mutex); 만약 뮤텍스를 동적으로 생성(pthread_mutex_init을 이용하여 초기화)했다면 없애준다.