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

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

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. 将ts文件合并为mp4命令

    cmd: copy/b D:\*.ts D:\new.ts 参考:http://blog.sina.com.cn/s/blog_66b4f1180102uzxs.html

  2. ffmpeg 资源[转]

    http://blog.csdn.net/leixiaohua1020/article/details/15811977 一. FFmpeg主站 1. FFmpeg的源码发布,资料 网址:   htt ...

  3. IOS Window窗口使用

    // 程序启动完毕之后就会调用一次 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS ...

  4. POI 怎么设置Excel整列的CellStyle啊

    POI 怎么设置Excel整列的CellStyle啊,而不是循环每个Cell.因为现在是生成Excel模板,不知道客户会输入多少行. 问题补充: 指尖言 写道 好像没有这个方法,CellStyle是C ...

  5. oc引用计数原理-引用计数相关变化

    http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...

  6. 【洛谷4252】[NOI2006] 聪明的导游(提答题)

    点此看题面 大致题意: 给你一张\(n\)个点.\(m\)条边的无向图,让你找出图上的一条不经过重复节点的最长路(提答+\(spj\)). 随机化乱搞 针对这种提答题,我们就要用随机化乱搞(Cptra ...

  7. angular路由学习笔记

    文章目录 标签routerLink路由传递参数 url中get传值 定义路由 获取参数 配置动态路由 定义路由 获取参数 API js路由跳转 配置动态路由 定义路由 获取参数 get传值 定义路由 ...

  8. RabbitMQ使用教程(五)如何保证队列里的消息99.99%被消费?

    1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用 ...

  9. kernel

    http://sebastianraschka.com/Articles/2014_kernel_pca.html

  10. C#箴言之用属性来访问类的私有成员

    在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问. ...