条件变量(二)这边文章主要纠结了pthread_cond_wait(&cond,&mutex)函数以及为何判断条件时要用while而不是if。
本文还想弄清楚另外两个关于pthread_cond_signal(&cond)的问题:
1、先改变条件值还是先调用pthread_cond_signal?
2、pthread_cond_signal写在临界区内还是临界区外?
问题一:先改变条件值还是先调用pthread_cond_signal?
其实都一样,因为已经持有锁了。在没有锁的情况下改变条件本来就很危险。当然可以在没有锁的情况下调用signal或者broadcast函数。
1 void signal() 2 { 3 pthread_mutex_lock(&mutex); 4 signaled = true; 5 pthread_cond_signal(&cond); //顺序可以调整 6 pthread_mutex_unlock(&mutex); 7 }
这个问题本人在github上请教过陈硕大神,见https://github.com/chenshuo/recipes/issues/18。在持有锁的情况下,没有其他线程可以从wait返回,因为阻塞在mutex_lock队列中,在等待锁,因为wait出来后要加锁:
1 void broadcast() 2 { 3 pthread_mutex_lock(&mutex_); 4 pthread_cond_broadcast(&cond_); 5 signaled_ = true; 6 pthread_mutex_unlock(&mutex_); 7 }
重点要讨论没有锁的情况:
线程A先pthread_cond_signal,唤醒了线程B的pthread_cond_wait,该线程唤醒后由于signal没有加锁,所以
1 void signal() 2 { 4 signaled = true; 5 pthread_cond_signal(&cond);
signaled = true;
7 }