典型的生产者,消费者多线程并发模型中,cond一般要和mutex配合使用,如下:
1.生产者:
pthread_mutex_lock(&mutex);
//set full
pthread_cond_signal(&cond); //通知消费者可以行动了
pthread_mutex_unlock(&mutex);
2.消费者:
pthread_mutex_lock(&mutex);
while(empty) pthread_cond_wait(&cond,&mutex);//消费者必须等待生产者,为啥要带锁等待?
pthread_mutex_unlock(&mutex);
wait要带锁是因为wait内部会首先unlock才开始阻塞等待,因为只有unlock,生产者才能
lock并进行生产,继而唤醒消费者,
消费者被唤醒后在wait内会重新lock(mutex)
signal唤醒一个,broadcast唤醒所有消费者,最后在持有mutex的情况下调用,否则有可能signal还未完成,消费者就直接进入临界区。
因此在wait函数内实行了unlock和重新lock,但对外展现的是一直lock的逻辑
wait函数最后放在while循环中等待,是因为有可能被别的消费者抢先消费了
网友评论