条件变量采用等待唤醒的机制处理线程同步问题。不同于锁的机制,在判断需要等待满足条件才能执行的任务是,不需要不断的加锁,查询,判断,解锁的过程,从而减轻了CPU负担。
条件变量一般和互斥量配合使用,互斥量用于上锁,而条件变量用于事件的等待。
条件变量会在进入等待时释放互斥量,进行解锁操作,并且该线程进入睡眠状态。直到有其他线程发送信号,唤醒该等待线程,等待成功。一旦等待成功,则重新获取互斥量,进行加锁操作。
一般信号等待会用循环而不是单纯的判断,因为发送信号到等待成功可能会需要一定的时间,如果不能保证在这段时间内等待的事件依然成立,则采用循环的方式进行判断。
1. 互斥量API。
int pthread_mutex_lock(pthread_mutex_t *mptr);
int pthread_mutex_trylock(pthread_mutex_t *mptr);
int pthread_mutex_unlock(pthread_mutex_t *mptr);
2.条件变量API
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t*attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_tmytex,const struct timespec *abstime);
in tpthread_cond_broadcast(pthread_cond_t *cond);
注:第一个和第五个API都为等待信号,但是第五个API添加了超时机制。