实现简单的消费者生产者
主要功能:生成produce()、消费consume()
先定义三个信号量empt(0)、full(100)、mtx(1)
mtx相当于是一把mutex锁,用于实现资源互斥,只允许一个进程访问资源,1表示可进入
empt表示的是生产者进程可使用的资源数
full表示的是生产者进程可使用的资源空位数
有两个很重要的细节
1、生产者和消费者必须先检查资源数再获得锁、在代码中就是先写full.wait()再写mtx.wait()或者先写empt.wait()再写mtx.wait()。因为如果先获得锁再检查资源数就有可能出现获得锁之后发现资源数小于0了,然后进程就挂起或睡眠,导致其他进程获得不了锁进不去生产资源唤醒该进程,而该进程又不释放锁,导致死锁
2、wait()必须先count减1再判断小于0然后再睡眠,signal()必须判断小于0再count加1然后再唤醒
#include<iostream>
#include"semaphore.h"
using namespace std;
semaphore empt(0), full(100), mtx(1);
int val = 0;
void produce() {
for (int i = 0; i < 10000; i++) {
full.wait();
mtx.wait();
val++;
cout << "val: " << val << endl;
mtx.signal();
empt.signal();
}
}
void consume() {
for (int i = 0; i < 10000; i++) {
empt.wait();
mtx.wait();
val--;
cout << "val: " << val << endl;
mtx.signal();
full.signal();
}
}
int main() {
thread pro_thread(produce);
thread con_thread(consume);
pro_thread.join();
con_thread.join();
}
semaphore.h代码在我的上一篇博客
关于生产者消费者更详细的介绍可以看这个小哥的,我觉得写得比我好多的
https://blog.csdn.net/HnuWyd/article/details/80607228