条件变量
条件变量是线程同步的另一种同步机制。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。
初始化
条件变量使用之前必须首先进行初始化,pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化。对于静态分配的条件变量可以将常量PTHREAD_COND_INITIALIZER赋给条件变量。对于动态分配的条件变量可以使用pthread_cond_init函数对条件变量进行初始化。
在释放底层的内存空间之前,可以使用pthread_mutex_destoy函数去初始化。
int pthread_cond_init(pthread_cond_t *restrict cond,
pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
等待
使用pthread_cond_wait函数等待条件为真,如果在给定的时间内不为真的话,生成一个出错码的返回变量。
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
int pthread_cond_timewait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict timeout);
pthread_cond_wait总和一个互斥锁结合使用。在调用pthread_cond_wait前要先获取锁。
pthread_cond_wait函数执行时先自动释放指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量重新锁住。
信号与唤醒
int pthread_cond_signal(pthread_cond_t * cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
pthread_cond_signal通过条件变量cond发送消息,若多个消息在等待,它只唤醒一个。
pthread_cond_broadcast可以唤醒所有。
调用pthread_cond_signal后要立刻释放互斥锁,因为pthread_cond_wait的最后一步是要将指定的互斥量重新锁
住,如果pthread_cond_signal之后没有释放互斥锁,pthread_cond_wait仍然要阻塞。
无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(
或pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。mutex互斥锁必须是普通锁
(PTHREAD_MUTEX_TIMED_NP)或者适应锁 (PTHREAD_MUTEX_ADAPTIVE_NP),且在调用
pthread_cond_wait()前必须由本线程加锁 (pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定
状态,并在线程挂起进入等待前解锁。在条件满足从而离开 pthread_cond_wait()之前,mutex将被重新加锁,以与进
入pthread_cond_wait()前的加锁动作对应。