pthread_creation(pthread_t *thread, const pthread_attr, void * (*start_routine)(void *), void *arg);
int pthread_join(pthread_t thread, void **value_ptr)
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unclock(pthread_t *mutex);
pthread_mutex_lock를 했을 때,
lock을 갖고 있는 스레드가 없으면 -> 내가 lock을 갖게 되고,
lock을 갖고 있는 스레드가 있으면 -> 다른 스레드가 lock을 놓을 때까지 기다림
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_sigal(pthread_cond_t);
얘는 conditional signal이 올 때까지, mutex를 unlock시킨 다음 현재 thread를 재우는 함수이다.
signal이 오면 mutex를 lock시킨 다음 ready 상태가 된다.
얘는 conditional signal을 보내서, 이 conditional variable 때문에 잠 든 스레드 중 하나를 깨운다.
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);