用信号量机制解决生产者消费者问题,要求:在windows环境下完成;使用c++语言;每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符;生产者和消费者各有两个以上,多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码;有界缓冲区设有20个存储单元,写入/取出的数据项设定为1-20这20个整型数
时间: 2024-02-13 20:01:07 浏览: 73
采用信号量法解决生产者消费者问题
好的,这是一个典型的生产者消费者问题,可以使用信号量机制来解决。
以下是一个简单的实现,满足您的要求:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <Windows.h>
using namespace std;
const int BUFFER_SIZE = 20;
queue<int> buffer;
int producer_id = 0;
int consumer_id = 0;
mutex mtx;
condition_variable not_full_cv;
condition_variable not_empty_cv;
int in = 0;
int out = 0;
int count = 0;
void producer(int id)
{
while (true)
{
unique_lock<mutex> lock(mtx);
while (count == BUFFER_SIZE)
{
not_full_cv.wait(lock);
}
int item = ++in;
buffer.push(item);
cout << "Producer " << id << " produces item " << item << endl;
count++;
cout << "Current buffer: ";
for (int i : buffer)
{
cout << i << " ";
}
cout << endl;
cout << "Current in: " << in << endl;
cout << "Current producer: " << producer_id << endl;
not_empty_cv.notify_all();
lock.unlock();
Sleep(1000);
}
}
void consumer(int id)
{
while (true)
{
unique_lock<mutex> lock(mtx);
while (count == 0)
{
not_empty_cv.wait(lock);
}
int item = buffer.front();
buffer.pop();
cout << "Consumer " << id << " consumes item " << item << endl;
count--;
cout << "Current buffer: ";
for (int i : buffer)
{
cout << i << " ";
}
cout << endl;
cout << "Current out: " << out << endl;
cout << "Current consumer: " << consumer_id << endl;
not_full_cv.notify_all();
lock.unlock();
Sleep(1000);
}
}
int main()
{
thread p1(producer, ++producer_id);
thread p2(producer, ++producer_id);
thread c1(consumer, ++consumer_id);
thread c2(consumer, ++consumer_id);
p1.join();
p2.join();
c1.join();
c2.join();
return 0;
}
```
解释一下代码的实现:
首先定义了有界缓冲区的大小,生产者和消费者的线程标识符,一个互斥量,两个条件变量,以及当前的缓冲区状态。
生产者函数中,首先获取互斥锁,然后判断缓冲区是否已满,如果已满则等待条件变量 not_full_cv,直到有消费者消费了一个数据项。然后生产一个数据项,将其加入缓冲区,并更新缓冲区状态。最后通知条件变量 not_empty_cv,有消费者可以消费了,释放互斥锁。
消费者函数中,首先获取互斥锁,然后判断缓冲区是否为空,如果为空则等待条件变量 not_empty_cv,直到有生产者生产了一个数据项。然后从缓冲区中取出一个数据项,并更新缓冲区状态。最后通知条件变量 not_full_cv,有生产者可以生产了,释放互斥锁。
在主函数中,创建两个生产者线程和两个消费者线程,并等待它们结束。
注意,在生产者和消费者函数中,更新缓冲区状态和当前指针位置的输出语句需要放在获取互斥锁之后,以避免输出混乱。
另外,为了满足您的要求,在每次生产者或消费者进行操作后,都会即时显示缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符。输出语句中的变量 producer_id 和 consumer_id 分别表示当前生产者和消费者的线程标识符,in 和 out 分别表示当前数据项的写入/取出指针位置。
希望这个代码可以满足您的需求!
阅读全文