以生产者-消费者模型为依据,在C加加环境下创建一个控制 台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步 与互斥。
时间: 2024-06-16 09:04:54 浏览: 108
在C++环境下创建一个控制台进程,使用生产者-消费者模型,并实现进程(线程)的同步与互斥,可以通过以下步骤实现:
1. 首先,需要定义一个共享的缓冲区,用于生产者和消费者之间的数据交换。可以使用一个数组或队列来实现。
2. 创建两个线程函数,一个用于生产者,一个用于消费者。生产者线程负责向缓冲区中添加数据,消费者线程负责从缓冲区中取出数据。
3. 在主函数中创建n个生产者线程和n个消费者线程,并启动它们。
4. 使用互斥锁(mutex)来保护对缓冲区的访问。在生产者线程中,在添加数据之前,需要先获取互斥锁;在消费者线程中,在取出数据之前,也需要先获取互斥锁。这样可以确保同一时间只有一个线程能够访问缓冲区。
5. 使用条件变量(condition variable)来实现线程的同步。在生产者线程中,如果缓冲区已满,则需要等待条件变量;在消费者线程中,如果缓冲区为空,则需要等待条件变量。当有数据被添加到缓冲区或从缓冲区取出时,需要通知等待的线程。
下面是一个简单的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
const int BUFFER_SIZE = 10;
int buffer[BUFFER_SIZE];
int count = 0;
std::mutex mtx;
std::condition_variable cv_producer, cv_consumer;
void producer(int id) {
for (int i = 0; i < 10; i++) {
std::unique_lock<std::mutex> lock(mtx);
cv_producer.wait(lock, [] { return count < BUFFER_SIZE; });
buffer[count++] = i;
std::cout << "Producer " << id << " produced: " << i << std::endl;
cv_consumer.notify_one();
}
}
void consumer(int id) {
for (int i = 0; i < 10; i++) {
std::unique_lock<std::mutex> lock(mtx);
cv_consumer.wait(lock, [] { return count > 0; });
int data = buffer[--count];
std::cout << "Consumer " << id << " consumed: " << data << std::endl;
cv_producer.notify_one();
}
}
int main() {
const int n = 5; // 创建5个生产者和5个消费者线程
std::thread producers[n];
std::thread consumers[n];
for (int i = 0; i < n; i++) {
producers[i] = std::thread(producer, i);
consumers[i] = std::thread(consumer, i);
}
for (int i = 0; i < n; i++) {
producers[i].join();
consumers[i].join();
}
return 0;
}
```
阅读全文