根据提示,在右侧编辑器补充代码,编程实现进程同步问题。假设缓冲区大小为10,生产者、消费者线程若干。生产者和消费者相互等待,只要缓冲池未满,生产者便可将消息送入缓冲池,只要缓冲池未空,消费者便可从缓冲池中取走一个消息。 【提示】程序编译时需要加入一个多线程-pthread。
时间: 2024-12-06 12:25:29 浏览: 14
多进程同步方法解决生产者-消费者问题(linux线程实现)
在C++中,我们可以使用互斥量(mutex)、条件变量(condition_variable)以及共享内存来实现生产者-消费者模型的进程同步。以下是使用`#include <pthread.h>`库的一个简单示例:
```cpp
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥锁
std::condition_variable cv_producer, cv_consumer;
int buffer[10] = {0}; // 缓冲区
int count = 0, producer_idx = 0, consumer_idx = 0;
void* producer(void* arg) {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv_consumer.wait(lock, [this] { return count < 10; }); // 等待缓冲池不满
buffer[producer_idx++] = ++count; // 生产者添加到缓冲池
if (producer_idx == 10) {
producer_idx = 0; // 循环数组
}
lock.unlock();
cv_producer.notify_one(); // 提醒消费者缓冲池有新的元素
std::cout << "Producer produced an item.\n";
}
return nullptr;
}
void* consumer(void* arg) {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv_producer.wait(lock, [this] { return count > 0; }); // 等待缓冲池非空
buffer[consumer_idx++] = --count; // 消费者从缓冲池取出一个元素
if (consumer_idx == 10) {
consumer_idx = 0; // 循环数组
}
lock.unlock();
cv_consumer.notify_one(); // 提醒其他消费者缓冲池中有空间
std::cout << "Consumer consumed an item.\n";
}
return nullptr;
}
int main() {
std::thread producer_thread(producer, nullptr);
std::thread consumer_thread(consumer, nullptr);
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在这个例子中,我们创建了两个线程,一个生产者和一个消费者。每个线程都有一个循环,当它们满足特定条件(缓冲池满或空)时,会进入等待状态,并通过条件变量唤醒另一个线程。
阅读全文