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

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

     

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

    为什么呢?

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

     

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

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

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

    编译运行:

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

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

    编译运行:

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

    下面再看结果:

    分析一下结果:

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

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

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

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

    1、对g_mutex进行解锁。

    为什么要先进行解锁呢?

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

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

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

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

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

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

  • 相关阅读:
    SSH公/私秘钥的生成及使用
    使用docker-compose部署Kafka集群
    使用docker或者docker-compose部署Zookeeper集群
    zookeeper相关概念
    redis相关概念
    mq-rabbitmq
    mysql事务隔离级别
    新自动化测试框架+微信机器人构建思路
    当eclipse调用tomcat的时候发生了什么?
    .net 获取配置项
  • 原文地址:https://www.cnblogs.com/webor2006/p/4254865.html
Copyright © 2011-2022 走看看