生产者生产物品用于消费者消费。生产者生产的商品只可以保存2个。生产者生产5次,消费者全部消费。消费者5次消费后死亡,生产者检测到消费者死亡后跟随死亡,并清空所有产品。c++代码
时间: 2024-05-13 16:18:07 浏览: 96
以下是一个可能的解决方案:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
const int MAX_PRODUCTS = 2; // 最多保存的产品数量
const int TOTAL_PRODUCTION = 5; // 生产者生产的总次数
const int TOTAL_CONSUMPTION = 5; // 消费者消费的总次数
int products = 0; // 当前保存的产品数量
bool isProducerAlive = true; // 生产者是否还活着
bool isConsumerAlive = true; // 消费者是否还活着
mutex mtx; // 互斥量,保证多线程同步
condition_variable cvProducer; // 生产者等待条件变量
condition_variable cvConsumer; // 消费者等待条件变量
void producer() {
for (int i = 0; i < TOTAL_PRODUCTION; i++) {
unique_lock<mutex> lck(mtx);
cvProducer.wait(lck, []{ return products < MAX_PRODUCTS || !isConsumerAlive; }); // 等待条件满足
if (!isConsumerAlive) { // 如果消费者已经死亡,生产者也立即死亡
isProducerAlive = false;
cvConsumer.notify_all(); // 唤醒其他线程
break;
}
products++; // 生产产品
cout << "Producer produced a product. There are " << products << " products now." << endl;
cvConsumer.notify_one(); // 唤醒一个消费者线程
}
}
void consumer() {
for (int i = 0; i < TOTAL_CONSUMPTION; i++) {
unique_lock<mutex> lck(mtx);
cvConsumer.wait(lck, []{ return products > 0 || !isProducerAlive; }); // 等待条件满足
if (!isProducerAlive && products == 0) { // 如果生产者已经死亡并且没有产品了,消费者也立即死亡
isConsumerAlive = false;
cvProducer.notify_all(); // 唤醒其他线程
break;
}
products--; // 消费产品
cout << "Consumer consumed a product. There are " << products << " products now." << endl;
cvProducer.notify_one(); // 唤醒一个生产者线程
}
}
int main() {
thread tProducer(producer);
thread tConsumer(consumer);
tProducer.join();
tConsumer.join();
return 0;
}
```
在主函数中,我们创建了一个生产者线程和一个消费者线程,并且让主线程等待它们结束。在生产者线程中,我们使用条件变量 `cvProducer` 等待满足以下条件之一:
- 当前保存的产品数量小于最多保存的产品数量 `MAX_PRODUCTS`。
- 消费者已经死亡。
如果条件满足,生产者就会生产一个产品,并且使用条件变量 `cvConsumer` 唤醒一个消费者线程。在消费者线程中,我们使用条件变量 `cvConsumer` 等待满足以下条件之一:
- 当前保存的产品数量大于0。
- 生产者已经死亡且当前保存的产品数量为0。
如果条件满足,消费者就会消费一个产品,并且使用条件变量 `cvProducer` 唤醒一个生产者线程。在生产者和消费者线程中,我们都使用互斥量 `mtx` 来保证多线程同步,并且使用 `unique_lock` 来自动加锁和解锁。当生产者或消费者线程检测到对方已经死亡后,就会立即死亡,同时使用条件变量 `cvConsumer` 或 `cvProducer` 唤醒其他线程。
阅读全文