pthread_cond_t cod = PTHREAD_COND_INITIALIZER
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t * condattr);
int pthread_cond_destory(pthread_cond_t *cond)
1永远不要拷贝条件变量,
2动态初始化条件变量时,应该在不需要时使用pthread_cond_destory,在释放时确认没有线程在等待条件变量,最好是使用广播了
该条件变量,确认唤醒其他线程,然后不会再有其他线程使用该条件变量
等待条件变量
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); //解锁互斥量
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex_t *mutex,struct timespec *expiration);
1 在锁住相关互斥量之后,和等待条件变量之前判断谓词是很重要的,有效防止pthread_cond_wait接受到pthread_cond_singal 和pthread_cond_broadcast而产生一直阻塞
2 因为 虚假唤醒, 唤醒之后检测谓词,被拦截的唤醒,松散的谓词 三个状态出现,唤醒之后判断谓词是否为真是值得的
3对待虚假唤醒 (条件就是谓词)
- while(条件不满足){
- condition_wait(cond, mutex);
- }
- 而不是:
- If( 条件不满足 ){
- Condition_wait(cond,mutex);
- }
4. 解锁和等待转移(wait morphing)
解锁互斥量mutex和发出唤醒信号condition_signal是两个单独的操作,那么就存在一个顺序的问题。谁先随后可能会产生不同的结果。如下:
[color=red](1) 按照 unlock(mutex); condition_signal()顺序, 当等待的线程被唤醒时,因为mutex已经解锁,因此被唤醒的线程很容易就锁住了mutex然后从conditon_wait()中返回了。
- //...
- unlock(mutex);
- condition_signal(cond);
(2) 按照 condition_signal(); unlock(mutext)顺序,当等待线程被唤醒时,它试图锁住mutex,但是如果此时mutex还未解锁,则线程又进入睡眠,mutex成功解锁后,此线程在再次被唤醒并锁住mutex,从而从condition_wait()中返回。
- //...
- condition_signal(cond);
- unlock(mutex);