可以用C++写一个使用poco库完成生产-消费者模型的代码吗
时间: 2024-03-17 17:40:17 浏览: 153
当然可以,以下是使用 Poco 库实现生产者-消费者模型的示例代码:
```
#include <iostream>
#include <queue>
#include <thread>
#include <chrono>
#include "Poco/Thread.h"
#include "Poco/Mutex.h"
#include "Poco/Condition.h"
using namespace std;
const int MAX_QUEUE_SIZE = 10; // 最大缓冲队列长度
queue<int> g_queue; // 全局缓冲队列
Poco::Mutex g_mutex; // 全局互斥量
Poco::Condition g_cond(g_mutex); // 全局条件变量
// 生产者线程函数
void producerThreadFunc()
{
for (int i = 1; i <= 20; i++)
{
Poco::Mutex::ScopedLock lock(g_mutex); // 加锁
while (g_queue.size() >= MAX_QUEUE_SIZE)
{
g_cond.wait(); // 队列已满,等待消费者消费
}
g_queue.push(i); // 生产一个数据
cout << "生产者生产了数据:" << i << endl;
g_cond.signal(); // 通知消费者
lock.unlock(); // 解锁
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 等待一段时间
}
}
// 消费者线程函数
void consumerThreadFunc()
{
while (true)
{
Poco::Mutex::ScopedLock lock(g_mutex); // 加锁
while (g_queue.empty())
{
g_cond.wait(); // 队列为空,等待生产者生产
}
int data = g_queue.front(); // 取出一个数据
g_queue.pop(); // 从队列中删除该数据
cout << "消费者消费了数据:" << data << endl;
g_cond.signal(); // 通知生产者
lock.unlock(); // 解锁
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 等待一段时间
}
}
int main()
{
// 创建生产者线程和消费者线程
std::thread producerThread(producerThreadFunc);
std::thread consumerThread(consumerThreadFunc);
// 等待两个线程结束
producerThread.join();
consumerThread.join();
return 0;
}
```
在上面的代码中,我们使用 Poco 库中的 Mutex 类和 Condition 类来实现互斥和条件变量,从而实现了生产者-消费者模型。其中,Mutex 类用于实现互斥锁,Condition 类用于实现条件变量,生产者和消费者线程通过互斥锁和条件变量来同步访问全局缓冲队列。
阅读全文