代码:
#include<iostream>
#include<vector>
#include<queue>
#include<ctime>
#include<thread>
#include<mutex>
#include<windows.h>
#include<condition_variable>
using namespace std;
// 信号量定义
class Semaphore {
private:
mutex mut;
condition_variable condition;
int count;
public:
Semaphore(int count = 0) : count(count) {};
//P操作
void P() {
unique_lock<mutex> unique(mut);
--count;
if (count < 0)
condition.wait(unique);
}
//V操作
void V() {
unique_lock<mutex> unique(mut);
++count;
if (count <= 0)
condition.notify_one();
}
};
Semaphore _mutex_(1); // 互斥临界区
Semaphore _empty_(10); // 空槽数
Semaphore _full_(0); // 非空槽数
const int SIZR_P = 5; //生产者数量
const int SIZE_C = 5; //消费者数量
queue<int>q; //缓冲区队列
// 生产者
void producter() {
while (true) {
Sleep(500);
srand(int(time(0)));
_empty_.P();
_mutex_.P();
int data = rand() % 1000;
q.push(data);
cout << this_thread::get_id() << " 生产了产品:" << data << endl;
_mutex_.V();
_full_.V();
}
}
// 消费者
void customer() {
while (true) {
Sleep(500);
_full_.P();
_mutex_.P();
int data = q.front();
q.pop();
cout << this_thread::get_id() << " 消费了产品:" << data << endl;
_mutex_.V();
_empty_.V();
}
}
int main() {
vector<thread> threads;
//创建线程
for (int i = 0; i < SIZR_P; ++i) threads.push_back(thread(producter));
for (int i = 0; i < SIZR_P + SIZE_C; ++i) threads.push_back(thread(customer));
for (int i = 0; i < SIZR_P + SIZE_C; ++i) threads[i].join();
return 0;
}
运行截图: