linux网络编程之posix条件变量

时间:2021-08-28 08:54:43

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

linux网络编程之posix条件变量

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

linux网络编程之posix条件变量

为什么呢?

linux网络编程之posix条件变量

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

linux网络编程之posix条件变量

linux网络编程之posix条件变量

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

linux网络编程之posix条件变量

linux网络编程之posix条件变量

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

编译运行:

linux网络编程之posix条件变量

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

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

linux网络编程之posix条件变量

linux网络编程之posix条件变量

编译运行:

linux网络编程之posix条件变量

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

linux网络编程之posix条件变量

下面再看结果:

linux网络编程之posix条件变量

分析一下结果:

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

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

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

linux网络编程之posix条件变量

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

1、对g_mutex进行解锁。

为什么要先进行解锁呢?

linux网络编程之posix条件变量

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

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

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

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

linux网络编程之posix条件变量

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