zoukankan      html  css  js  c++  java
  • 什么是虚假唤醒 spurious wakeup

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

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

    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()函数之间,

    更多讨论参见[ http://www.newsmth.net/nForum/#!article/CPlusPlus/389196 ]

  • 相关阅读:
    html调用js提示方法名 is not defined处理方法
    Amazon Redshift 基于 PostgreSQL 8.0.2
    Data Nodes
    AWS X-Ray
    API Gateway 中控制和管理对 REST API 的访问
    CodeBuild 与 Amazon Virtual Private Cloud 结合使用
    ElastiCache for Redis 缓存策略
    在 AWS X-Ray 控制台中配置采样规则
    什么是 Amazon Kinesis Data Analytics for SQL 应用程序?
    AWS Secrets Manager
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5558698.html
Copyright © 2011-2022 走看看