用c++模拟解决生产者-消费者问题,创建两个进程即生产者进程和消费者进程,让这两个进程共享同一个缓冲区,缓冲区最大为5,生产者最多生产20次,使用pthread库提供的线程操作,使用POSIX信号量机制
时间: 2024-12-20 16:19:09 浏览: 13
在C++中,我们可以使用`<thread>`库来创建生产者和消费者进程,同时利用`<mutex>`、`<condition_variable>`和`<semaphore>`来模拟生产者-消费者问题。这里是一个简化的示例:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
#include <semaphore.h>
const int BUFFER_SIZE = 5;
const int MAX_PRODUCES = 20;
std::vector<int> buffer(BUFFER_SIZE);
int produced = 0;
int consumed = 0;
bool producing = false;
bool consuming = false;
std::mutex mtx;
std::condition_variable cond_prod, cond_cons;
Semaphore sem(0); // 创建互斥信号量
void producer() {
for (int i = 0; i < MAX_PRODUCES && !producing; ++i) {
std::unique_lock<std::mutex> lock(mtx);
while (buffer.size() == BUFFER_SIZE || !consuming) { // 当缓冲满或消费停止时等待
cond_prod.wait(lock);
}
buffer.push_back(i); // 生产数据
++produced;
lock.unlock();
sem.post(); // 通知消费者缓冲有新的数据
std::cout << "Producer produced: " << i << std::endl;
}
producing = false;
}
void consumer() {
for (int i = 0; i < MAX_PRODUCES && !consuming; ++i) {
std::unique_lock<std::mutex> lock(mtx);
while (buffer.empty() || produced == 0) { // 当缓冲空或无数据可消费时等待
cond_cons.wait(lock);
}
int data = buffer.front(); // 消费数据
buffer.pop_front();
++consumed;
lock.unlock();
sem.wait(); // 等待生产者释放
std::cout << "Consumer consumed: " << data << std::endl;
}
consuming = false;
}
int main() {
std::thread producer_thread(producer);
std::thread consumer_thread(consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在这个示例中,我们使用了信号量`sem`来控制生产者的生产次数和消费者的消费次数,以及`mutex`和`condition_variable`来保证并发环境下的数据安全。
阅读全文