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

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

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 ]

什么是虚假唤醒 spurious wakeup的更多相关文章

  1. 多线程编程中条件变量和的spurious wakeup 虚假唤醒

    1. 概述 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 1) 线程等待 ...

  2. 刨根问底系列(1)——虚假唤醒(spurious wakeups)的原因以及在pthread_cond_wait、pthread_cond_singal中使用while的必要性

    刨根问底之虚假唤醒 1. 概要 将会以下方式展开介绍: 什么是虚假唤醒 什么原因会导致虚假唤醒(两种原因) 为什么系统内核不从根本上解决虚假唤醒这个"bug"(两个原因) 开发者如 ...

  3. Java-JUC(八):使用wait,notify|notifyAll完成生产者消费者通信,虚假唤醒(Spurious Wakeups)问题出现场景,及问题解决方案。

    模拟通过线程实现消费者和订阅者模式: 首先,定义一个店员:店员包含进货.卖货方法:其次,定义一个生产者,生产者负责给店员生产产品:再者,定义一个消费者,消费者负责从店员那里消费产品. 店员: /** ...

  4. pthread_cond_wait的spurious wakeup问题

    最近在温习pthread的时候,忽然发现以前对pthread_cond_wait的了解太肤浅了.昨晚在看<Programming With POSIX Threads>的时候,看到了pth ...

  5. JUC虚假唤醒(六)

    为什么条件锁会产生虚假唤醒现象(spurious wakeup)? ​ 在不同的语言,甚至不同的操作系统上,条件锁都会产生虚假唤醒现象.所有语言的条件锁库都推荐用户把wait()放进循环里: whil ...

  6. java多线程 生产者消费者案例-虚假唤醒

    package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { ...

  7. notify丢失、虚假唤醒

    notify丢失: 假设线程A因为某种条件在条件队列中等待,同时线程B因为另外一种条件在同一个条件队列中等待,也就是说线程A/B都被同一个Object.wait()挂起,但是等待的条件不同. 现在假设 ...

  8. pthread_cond_wait虚假唤醒

    pthread_cond_wait中的while()不仅仅在等待条件变量前检查条件cond_is_false是否成立,实际上在等待条件变量后也检查条件cond_is_false是否成立.在多线程等待的 ...

  9. (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁

    8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public stat ...

随机推荐

  1. JavaScript: apply , call 方法

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  2. World Wind Java开发之十二——加载粗制三维模型(ExtrudedPolygon)(转)

    ww可以根据DLG图批量生成假三维模型,这对于小区等特征相似的建筑物模型的构建是非常有用的.下面来看如何一步步实现假三维模型的加载: 1.Shp文件的制作 首先在arcmap下数字化几个建筑物,并新建 ...

  3. UVA Live Archive 4394 String painter(区间dp)

    区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...

  4. iOS将大文件映射到内存(读取大文件)

    http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...

  5. find - 递归地在层次目录中处理文件

    总览 SYNOPSIS find [path...] [expression] 描述 DESCRIPTION 这个文档是GNU版本 find 命令的使用手册. find 搜索目录树上的每一个文件名,它 ...

  6. Python实现注册和登录

    一.注册账号需要实现的功能 1.输入:用户名,密码,密码确认 2.限制1:输入的账号和密码不能为空 3.限制2:两次输入密码必须一致 4.限制3:用户名不能重复 5.限制4:错误次数为4次 6.用字典 ...

  7. @TransactionConfiguration过时与替代写法

    在使用了Spring的项目中做单元测试时,以前的标准写法是这样的: 但是在高版本的Spring框架中(Spring4.2以后),@TransactionConfiguration已经标注为过时的注解, ...

  8. AngularJS 数组

    AngularJS数组就像Javascript数组 <!DOCTYPE html><html><head><meta http-equiv="Con ...

  9. require.js模块化开发

    模块化开发的原因: 1.引入的js过多然后在加载的过程中容易出现假死的状态,导致页面会发生白屏 2.变量名的问题 在多人协作开发的时候容易出现变量名的冲突 面向对象 3.引入优先级的问题 模块化开发分 ...

  10. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...