操作系统实验:进程同步, 编写实现生产者-消费者问题的同步算法; 通过程序输出信息观察模型中各线程的活动情况。 2、程序使用结构、类、函数介绍 示例: 3、程序实现代码
时间: 2024-10-19 11:03:43 浏览: 157
在C++中,操作系统实验中的进程同步主要涉及互斥量(Mutex)、条件变量(Condition Variable)和信号量(Semaphore)等工具,这些是用于控制多个线程访问共享资源的机制,确保数据的一致性和避免竞态条件。
生产者-消费者问题是经典的并发编程问题,它涉及到两个线程:一个是生产者,负责生成产品放入队列;另一个是消费者,从队列中取出并消费产品。为了同步这两个线程,我们可以使用互斥量来保护共享资源(队列),以及条件变量来协调何时产生或消费产品。
以下是一个简单的C++实现,使用了`std::mutex`(互斥锁)和`std::condition_variable`:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
// 定义生产者和消费者的公共接口
class Product {
public:
std::string name;
};
class ProducerConsumer {
private:
std::queue<Product> queue_;
std::mutex mutex_; // 互斥锁
std::condition_variable cond_prod; // 生产者等待条件
std::condition_variable cond_cons; // 消费者等待条件
public:
void produce(Product product) {
std::unique_lock<std::mutex> lock(mutex_);
if (queue_.empty()) {
cond_cons.wait(lock); // 消费者空,生产者等待
}
queue_.push(product);
std::cout << "Produced: " << product.name << std::endl;
lock.unlock();
cond_prod.notify_one(); // 唤醒一个等待的消费者
}
void consume() {
std::unique_lock<std::mutex> lock(mutex_);
while (queue_.empty()) {
cond_prod.wait(lock); // 生产者空,消费者等待
}
Product product = queue_.front();
queue_.pop();
std::cout << "Consumed: " << product.name << std::endl;
lock.unlock();
cond_cons.notify_one(); // 唤醒一个等待的生产者
}
};
int main() {
ProducerConsumer producer_consumer;
std::thread producer("Producer", &producer_consumer);
std::thread consumer("Consumer", &producer_consumer);
// 生产者和消费者逻辑
for (int i = 0; i < 5; ++i) {
producer_consumer.produce({ "Product " + std::to_string(i+1) });
}
producer.join();
for (int i = 0; i < 5; ++i) {
producer_consumer.consume();
}
consumer.join();
return 0;
}
```
在这个例子中,我们定义了一个`ProducerConsumer`类,其中包含生产者和消费者的方法。`produce`和`consume`函数分别在各自的线程中执行,通过互斥锁和条件变量保证了同步。当生产者发现队列为空时,它会唤醒一个正在等待的消费者;同样,当消费者找到产品后,它也会通知一个正在等待的生产者。
阅读全文