码迷,mamicode.com
首页 > 其他好文 > 详细

什么是虚假唤醒 spurious wakeup

时间:2016-06-04 14:57:19      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

解释一下什么是虚假唤醒?

说具体的例子,比较容易说通.

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(&notfull, &lock);

    }

    makeing the product;

    pthread_cond_signal(&notempty);

    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(&notempty,&lock);

    }

    consume a product;

    pthread_cond_signal(&notfull);

    pthread_cond_unlock(&lock);

  }

  return 0;

}

 

int main(){

  pthread_t p,c;

  void *retal;

  pthead_mutex_init(&lock,NULL);

  pthread_cond_init(&notempty,NULL);

  pthread_cond_init(&notfull,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(&notempty);

  pthread_cond_destory(&notfull);

}

考虑生产者和消费者问题,对于生产者线程来说,当它得到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

 

什么是虚假唤醒 spurious wakeup

标签:

原文地址:http://www.cnblogs.com/li-daphne/p/5558698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!