一、C++实现代码
#include<iostream>
#include<queue>
#include<mutex>
#include<thread>
#include<condition_variable>
using namespace std;
mutex mymutex;
condition_variable condition;
class Queue {
public:
void put(int val)
{
unique_lock<mutex> myunilock(mymutex);
while (!que.empty()) {
condition.wait(myunilock);
}
que.push(val);
condition.notify_all();
cout << "生产了:" << val << " 号产品" << endl;
}
int get() {
unique_lock<mutex> myunilock(mymutex);
while (que.empty()) {
condition.wait(myunilock);
}
int val = que.front();
que.pop();
condition.notify_all();
cout << "消费了:" << val << " 号产品" << endl;
return val;
}
private:
queue<int> que;
};
void producer(Queue* que) {
for (int i = 0; i < 10; ++i) {
que->put(i);
this_thread::sleep_for(chrono::milliseconds(100));
}
}
void consumer(Queue* que) {
for (int i = 0; i < 10; ++i) {
que->get();
this_thread::sleep_for(chrono::milliseconds(100));
}
}
int main() {
Queue que;
thread t1(producer,&que);
thread t2(consumer, &que);
t1.join();
t2.join();
return 0;
}
二、代码流程解释
假设消费者线程,抢占锁成功,生产者获取不到锁,就会阻塞在unique_lock myunilock(mymutex)这行代码处。
消费者先执行 ,判断队列是否为空,发现为空(因为此时还没有生产任何产品),进入while循环,进入等待并释放锁,此时生产线程拿到锁,同样判读队列是否为空,发现为空,不会进入while循环,直接执行生产代码,接着执行condition.notify_all();相当于通知消费者模型,我这边生产出产品了,你可以进行消费,那么消费者就可以退出等待的状态,但是此时并不能执行接下来的消费代码因为此时的消费者线程并没有获取到锁,属于阻塞的状态,当生产者模型的代码完全执行完之后,释放锁,之后消费者获取锁,才能进行消费。若此时生产者线程先与消费者抢占到锁,那么会进入生产者线程,判断队列是否为空,不为空,进入while循环,等待消费者,进入等待并释放锁,接着消费者拿到锁。。。。。重复步骤执行。
学习视频:生产者消费者模型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)