编写c++程序,在visual studio环境下解决经典进程同步问题:生产者消费者问题。 具体要求: 定义生产者数量为1,消费者数量为1,二者者异步执行。 定义缓冲区长度为5。 其中,生产者一共生产20次。 记录生产消费过程,并打印。
时间: 2024-12-20 09:21:57 浏览: 10
在Visual Studio环境中编写C++程序来解决经典的生产者消费者问题,可以使用互斥量、条件变量和环形缓冲区来实现线程同步。这里是一个简化版的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
const int PRODUCER_COUNT = 1;
const int CONSUMER_COUNT = 1;
const int BUFFER_SIZE = 5;
std::queue<int> buffer(BUFFER_SIZE);
std::mutex mtx; // 用于保护队列操作
std::condition_variable cv_prod, cv_cons; // 条件变量
// 生产者函数
void producer(int id) {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
if (buffer.size() < BUFFER_SIZE) { // 如果缓冲区未满
buffer.push(i); // 生产数据
std::cout << "Producer " << id << ": Produced item " << i << "\n";
cv_prod.notify_one(); // 醒通知消费者
} else {
std::cout << "Producer " << id << ": Buffer is full, waiting...\n";
cv_prod.wait(lock); // 等待缓冲区空闲
}
}
}
// 消费者函数
void consumer(int id) {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv_cons.wait(lock, []{ return !buffer.empty(); }); // 当缓冲区非空时唤醒消费者
if (buffer.empty()) break; // 如果缓冲区为空,退出循环
int data = buffer.front();
buffer.pop(); // 消费数据
std::cout << "Consumer " << id << ": Consumed item " << data << "\n";
}
}
int main() {
std::thread producer_thread(producer, 0);
std::thread consumer_thread(consumer, 0);
producer_thread.join();
consumer_thread.join();
std::cout << "Production and consumption finished.\n";
return 0;
}
```
这个例子中,我们创建了一个生产者和一个消费者线程,生产者向缓冲区添加元素,消费者从缓冲区取出元素。通过互斥锁保证了对缓冲区操作的原子性,而条件变量则实现了生产者和消费者之间的通信,使得生产者等待缓冲区空闲,消费者等待缓冲区非空。
运行此程序,你将看到生产和消费的过程以及相应的日志信息。
阅读全文