今天来学习posix的最后一个相关知识----条件变量,言归正传。
下面用一个图来进一步描述条件变量的作用:
为什么呢?
这实际上可以解决生产者与消费者问题,而且对于缓冲区是*的是一种比较理解的解决方案,只有有产品时才通知消费者开始消费产品,生产者不关心缓存区是否满,后面会用条件变量与互斥锁来解决生产者与消费者问题。
下面则根据上面的使用规范来解决生产者与消费者问题:
【说明】:这里并没有用到缓冲区,而是只要发现条件不满足则等待,直接条件满足才消费,所以实现了一个*的缓冲区,另外nready来简单模拟产品。
另外为了首次让消费者进行等待,在创建消费者线程之后小睡一会:
编译运行:
下面也来分几种情况来查看消费者与生产者之间的关系:
①、消费得比较快,生产得比较慢
编译运行:
②、生产速度比较快,消费得比较慢:
下面再看结果:
分析一下结果:
为啥之后没有等待线程呢?这是由于消费者的个数不如生产者线程的个数,消费速度不够快,结合代码来解释:
所以,当消费者比生产者少时,等待的机率就会少很多。
以上就是利用条件变量与互斥锁来解决生产者与消费者问题,下面来理解一些细节,也是理解代码很关键的地方:
它主要是做了下面三件事:
1、对g_mutex进行解锁。
为什么要先进行解锁呢?
2、等待条件,直到有线程向它发起通知。
3、重新对g_mutex进行加锁操作。
这三者构成了一个pthread_cond_wait原语,条件变量的使用最难的地方就是这个函数隐藏动作的理解,需细细体会下。
在上面留了一个问题,就是:
可以从man帮助中寻找到答案:
以上就是对条件变量的学习,至此,经常很长一段的学习,linux网络编程的知识点先学习到这,接下来会用实际的综合应用来巩固所学的这些知识点,下节继续~~~