zoukankan      html  css  js  c++  java
  • linux网络编程之posix条件变量

    今天来学习posix的最后一个相关知识----条件变量,言归正传。

     

    下面用一个图来进一步描述条件变量的作用:

    为什么呢?

    这实际上可以解决生产者与消费者问题,而且对于缓冲区是无界的是一种比较理解的解决方案,只有有产品时才通知消费者开始消费产品,生产者不关心缓存区是否满,后面会用条件变量与互斥锁来解决生产者与消费者问题。

     

    下面则根据上面的使用规范来解决生产者与消费者问题:

    【说明】:这里并没有用到缓冲区,而是只要发现条件不满足则等待,直接条件满足才消费,所以实现了一个无界的缓冲区,另外nready来简单模拟产品。

    另外为了首次让消费者进行等待,在创建消费者线程之后小睡一会:

    编译运行:

    下面也来分几种情况来查看消费者与生产者之间的关系:

    ①、消费得比较快,生产得比较慢

    编译运行:

    ②、生产速度比较快,消费得比较慢:

    下面再看结果:

    分析一下结果:

    为啥之后没有等待线程呢?这是由于消费者的个数不如生产者线程的个数,消费速度不够快,结合代码来解释:

    所以,当消费者比生产者少时,等待的机率就会少很多。

    以上就是利用条件变量与互斥锁来解决生产者与消费者问题,下面来理解一些细节,也是理解代码很关键的地方:

    它主要是做了下面三件事:

    1、对g_mutex进行解锁。

    为什么要先进行解锁呢?

    2、等待条件,直到有线程向它发起通知。

    3、重新对g_mutex进行加锁操作。

    这三者构成了一个pthread_cond_wait原语,条件变量的使用最难的地方就是这个函数隐藏动作的理解,需细细体会下。

    在上面留了一个问题,就是:

    可以从man帮助中寻找到答案:

    以上就是对条件变量的学习,至此,经常很长一段的学习,linux网络编程的知识点先学习到这,接下来会用实际的综合应用来巩固所学的这些知识点,下节继续~~~

  • 相关阅读:
    《Programming WPF》翻译 第8章 1.动画基础
    一些被遗忘的设计模式
    《Programming WPF》翻译 第4章 数据绑定
    《Programming WPF》翻译 第3章 控件
    《Programming WPF》翻译 第5章 样式和控件模板
    《Programming WPF》翻译 第7章 绘图
    《Programming WPF》翻译 第9章 自定义控件
    《Programming WPF》翻译 第7章 绘图 (2)
    《Programming WPF》翻译 第8章 前言
    关于Debug和Release之本质区别
  • 原文地址:https://www.cnblogs.com/webor2006/p/4254865.html
Copyright © 2011-2022 走看看