[OS] Thread API

진실·2021년 12월 7일
0
post-custom-banner

Thread Creation

pthread_create

pthread_creation(pthread_t *thread, const pthread_attr, void * (*start_routine)(void *), void *arg);
  • thread : 스레드가 생성돼서 바인딩 될 스레드 변수
  • attr : 스택 크키, 스케줄링 우선순위 등 각종 설정 값
  • start_routine : 이 스레드가 실행할 함수
  • arg : 함수에 넘겨줄 인자

pthread_join

int pthread_join(pthread_t thread, void **value_ptr)
  • thread : 현재 exit하기를 기다리는 스레드
  • value_ptr : 리턴값에 대한 포인터

Locks

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unclock(pthread_t *mutex);

pthread_mutex_lock를 했을 때,
lock을 갖고 있는 스레드가 없으면 -> 내가 lock을 갖게 되고,
lock을 갖고 있는 스레드가 있으면 -> 다른 스레드가 lock을 놓을 때까지 기다림

  • int pthread_mutex_trylock(pthread_mutex_t *mutex)
    lock을 갖고 있는 스레드가 있으면 failure를 리턴한다.
  • int pthread_mutex_timelock(pthread_mutex_t mutex, struct timespec abs_timeout)
    timeout될 동안 lock acquire를 시도하고, time out 되면 false를 리턴한다

Condition Variables

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_sigal(pthread_cond_t);

pthread_cond_wait

얘는 conditional signal이 올 때까지, mutex를 unlock시킨 다음 현재 thread를 재우는 함수이다.
signal이 오면 mutex를 lock시킨 다음 ready 상태가 된다.

pthread_cond_signal

얘는 conditional signal을 보내서, 이 conditional variable 때문에 잠 든 스레드 중 하나를 깨운다.

example

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t init = PTHREAD_COND_INITIALIZER;

pthread_mutex_lock(&lock);
//초기화될 때까지 spinning함
while(initialized==0){
    // init signal이 올때까지 unlock시킨 후 sleep 시킴
    pthread_cond_wait(&init, &lock);
    // init signal을 받으면 lock을 잡은 뒤, while condition 한 번 더 체크
}
// while condition 체크까지 끝났으니 lock을 release 해 줌
pthread_mutex_unlock(&lock);

// initialized는 한번에 한 스레드만 접근해야 하니 lock을 걸고
pthread_mutex_lock(&lock);
initialized = 1;
// 초기화를 했으니 init signal을 보냄
pthread_cond_signal(&init);
// initialized에 대한 lock을 release 시킴
pthread_mutex_unlock(&lock);
profile
반갑습니다.
post-custom-banner

0개의 댓글