并行编程之条件变量(posix condition variables)
在整理Java LockSupport.park()的东东,看到了个"Spurious wakeup",重新梳理下。
#include <pthread.h>
struct msg {
struct msg m_next;
/ … more stuff here … */
};
struct msg *workq;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
void process_msg(void) {
struct msg mp;
for (;😉 {
pthread_mutex_lock(&qlock);
while (workq == NULL)
pthread_cond_wait(&qready, &qlock);
mp = workq;
workq = mp->m_next;
pthread_mutex_unlock(&qlock);
/ now process the message mp */
}
}
void enqueue_msg(struct msg *mp) {
pthread_mutex_lock(&qlock);
mp->m_next = workq;
workq = mp;
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
}
一个简单的消息生产者和消费者的代码,它们之间用condition同步。
这个代码最容易让人搞混的是process_msg函数里的pthread_mutex_lock 和 pthread_mutex_unlock 是一对函数调用,前面加锁,后面解锁。的确,是加锁解锁,但是它们两不是一对的。它们的另一半在pthread_cond_wait函数里。
pthread_cond_wait函数可以认为它做了三件事:
把自身线程放到condition的等待队列里,把mutex解锁;
等待被唤醒(当其它线程调用pthread_cond_signal或者pthread_cond_broadcast时);
被唤醒之后,对mutex加锁,再返回。
mutex和condition实际上是绑定在一起的,一个condition只能对应一个mutex。
在Java的代码里,Condition对象只能通