解释一下什么是虚假唤醒?
说具体的例子,比较容易说通.
pthread_mutex_t lock;
pthread_cond_t notempty;
pthread_cond_t notfull;
void *producer(void *data){
for(int i = 0;i<=16;i++){
pthread_mtext_lock(&lock);
while(buffer if full){
pthread_cond_wait(¬full, &lock);
}
makeing the product;
pthread_cond_signal(¬empty);
pthread_mutex_unlock(&lock);
}
return 0;
}
void *consumer(void *data){
int i = 0;
while(1){
pthread_mutext_lock(&lock);
if(i++>16) break;
while(buffer is empty){
pthread_cond_wait(¬empty,&lock);
}
consume a product;
pthread_cond_signal(¬full);
pthread_cond_unlock(&lock);
}
return 0;
}
int main(){
pthread_t p,c;
void *retal;
pthead_mutex_init(&lock,NULL);
pthread_cond_init(¬empty,NULL);
pthread_cond_init(¬full,NULL);
//create thread
pthread_create(&p,NULL,producer,0);
pthread_create(&c,NULL,consumer,0);
//join
pthread_join(c,&retval);
pthread_join(c,&retval);
//destory
pthread_mutex_destroy(&lock);
pthread_cond_destory(¬empty);
pthread_cond_destory(¬full);
}
考虑生产者和消费者问题,对于生产者线程来说,当它得到buffer的访问互斥访问权限时,它会判断现在的buffer缓冲区是不是已经满了,如果已经满了full?
如果buffer缓冲区现在满了,那么他就会通过pthread_cond_wait()函数 把自己给阻塞,等待空出一个位置.
一直等到消费者线程消费了一个元素,利用pthread_cond_signal()函数通知生产者线程,"空位置有了,你可以生产东西了."
因为可能多个生产者/消费者线程共享同一个buffer缓冲区,
那么,当P_a线程阻塞到wait函数上,S_a线程消费了一个元素,利用signal()函数通知P_a的wait()函数之间,
又来了一个P_b线程拿到了buffer缓冲区的互斥访问权限,看到了空出了位置,没有经过wait()函数阻塞自己,就直接生产东西.但是原来的w