#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<thread>
#include<windows.h>
#define n 10 //缓冲区大小为10
using namespace std;
int in = 0, out = 0;
int buffer[n];
int mutex = 1, empty_ = n, full = 0;//mutex互斥信号量实现诸线程对缓冲池的互斥使用,
//信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
void wait(int &s){
while (s <= 0);//若s <=0 则一直等待
--s;//上锁
}
void signal(int &s){
++s;//释放
}
int product(){//随机产生消息
srand((unsigned)time(NULL));
for (int i = 0;i < 10;++i) {
return rand();
}
}
void producer(){//生产者线程
while (1){
int nextp = product();//产生消息
wait(empty_);//如empty_不为0,--empty,empty为0就等待
wait(mutex);//上锁
cout << "生产者产生了消息:" << nextp << endl;
Sleep(1000);
buffer[in] = nextp;
in = (in + 1) % n;
//Sleep(1000);
signal(mutex);//释放
signal(full);//和wait(empty)成对出现
}
}
void consumer(){//消费者线程
while (1){
wait(full);//上锁
wait(mutex);//上锁
cout << "消费者尝试获取消息" << endl;
int nextc = buffer[out];
out = (out + 1) % n;
cout << "成功!消费者获取了消息:" << nextc<<endl;
Sleep(1000);
signal(mutex);//解锁
signal(empty_);//解锁
}
}
int main(){
thread pro(producer),pro2(producer),pro3(producer);//创建三个生产者线程
thread con(consumer);//创建一个消费者线程
pro.join();//等待线程结束再执行main函数
return 0;
}
04-28
2355
