目录:
1.条件变量概念
2.生产者消费者模型
3.将条件变量+生产者消费者+blockqueue(阻塞队列)生产者消费者模型
4.重新复盘生产者消费者模型应用的理解
------------------------------------------------------------------------------------------------------------------------
1.条件变量概念
当一个线程互斥的访问某个变量(也就是临界资源)时,它可能发现在其它线程改变状态之前,它什么也做不了。
我们想使用条件变量,其中我们条件变量使用的数据类型是pthread_cond_t ,如果要创建条件变量,和我们的互斥锁一样,只需要在我们的类中或者在代码的全局区域定义上一个 pthread_cond_t类型的变量,原生线程库就自动帮你条件变量
条件变量有两个核心函数
1.pthread_cond_wait
2.pthread_cond_signal
------------------------------------------------------------------------------------------------------------------------
我们在了解了这些接口之后,先写一个简单的功能,让一个线程控制一个线程启停这样的程序
pthread_cond_broadcast
--------------------------------------------------------------------------------------------------------------------
2.生产者消费者模型
要是我将FunctionA 这个函数和 FunctionB 这个函数交给了,两个线程
我们就把这种场景称为生产者消费者模型!!!!
------------------------------------------------------------------------------------------------------------------------
超市本身不就一份临界资源!!!!
-----------------------------------------------------------------------------------------------------------------------
3.将条件变量+生产者消费者+blockqueue(阻塞队列)生产者消费者模型
之前我们我们进程讲的进程间通信,不管是管道还是共享内存,进程间通信的本质都是让不同的进程看到同一份资源,但今天,我们可以已同样的视角去看待我们的生产者和消费者模型,我们之前讲进程间通信就是生产者消费者模型,所以管道内部自带同步和互斥机制,而其中管道文件和共享内存就是交易场所
----------------------------------------------------------------------------------------------------------------------------
BlockingQueue(阻塞队列)
在多线程编程种阻塞队列是一种常用于实现生产者和消费者模型的数据结构,其与普通队列区别在于,当队列为空时,从队列当中获取元素的操作将会被阻塞,直到队列中放入元素,当队列为满时,往队列里存放元素的存在也会被阻塞,直到有元素被从队列中取出为止(也就需要条件变量)
-------------------------------------------------------------------------------------------------------------------
我们的CpTest.cc的代码先写到这里,我们卯足了劲的写我们的类BlockQueue代码
------------------------------------------------------------------------------------------------------------------------------
你生产者生产的在快,也要等我的消费者,反之也是一样的
那既然消费者消费的那么慢,生产者生产的快,这种场景下,还是得让生产者等消费者,这种场景怎么理解呢??
是函数就有可能挂起失败,挂起失败,因为if判断是满足条件的,此时队列是慢的,失败程序继续往下走,就有可能继续插入数据,插入一条不该在这时候插入的数据
伪唤醒条件没有满足。但是我线程被唤醒了,此时队列也可能是慢的,单只程序继续往下走,就有可能插入一条不该插入 的数据
这if不合适,应该用while,当我唤醒了之后,在做判断,只要while这个条件还是满足的,我继续挂起,如果条件不满足,我在去生产数据
----------------------------------------------------------------------------------------------------------------------------
我们要意识到一个问题,生产和传输数据只是第一步
1.数据怎么来的?? 耗时吗??
2.数据怎么处理??耗时吗??
生产者生产出一批任务 ----> 生产两个数据 x ,y 和 ”+-*/“ 放进任务队列里
让消费者从任务队列里拿到这个任务,,拿到自己的上下文之后,然后进行对x 和 y进行”+-*/“的操作!!
此时我们生产者不断的在生产任务,我们的消费者在不断的处理任务,所以呢此时我们就相当于一个在不断进行生产,一个在不断把任务拿出来,在做处理,所以此时我们就出现了消费者在做任务处理时,生产者在派发任务,就实现了并行运行