C++ 模板生产者消费者模型,可存放任意数据类型
c++版本生产者消费者模型:
#include <mutex>
#include <deque>
#include <future>
#include <iostream>
template <typename T>
class LoopQueue
{
public:
LoopQueue()
{
}
void Push(const T &element)
{
//这个lock用于对生产者间的同步
std::unique_lock<std::mutex> lock(m_mutex);
m_deqDatas.push_back(element);
//信号量用于生产者,消费者间的同步
// m_notEmpty.notify_one();
m_notEmpty.notify_all();
}
T Pop()
{
//这个lock用于配合信号量的使用
std::unique_lock<std::mutex> lock(m_mutex);
/*当后面的lambda返回false时,则信号量进入wait,此时自动释放lock
*等待到信号量后,则再获取lock
*/
m_notEmpty.wait(lock, [this]
{ return !m_deqDatas.empty(); });
//取元素返回
T front = m_deqDatas.front();
m_deqDatas.pop_front();
return front;
}
bool Empty()
{
//这个lock用于对消费者,生产者线程的互斥
std::unique_lock<std::mutex> lock(m_mutex);
return m_deqDatas.empty();
}
size_t Size()
{
//这个lock用于对消费者,生产者线程的互斥
std::unique_lock<std::mutex> lock(m_mutex);
return m_deqDatas.size();
}
private:
std::deque<T> m_deqDatas;
//互斥量,对队列进行同步保护
std::mutex m_mutex;
//用于限制消费者线程
std::condition_variable m_notEmpty;
};
void producer(LoopQueue<int> *dep)
{
while (1)
{
std::this_thread::sleep_for(std::chrono::seconds(rand() % 3));
int num = rand() % 1000 + 1;
dep->Push(num);
std::cout << "producer, Push ==========: " << num << std::endl;
// break;
}
}
void consumer(LoopQueue<int> *dep)
{
while (1)
{
std::this_thread::sleep_for(std::chrono::seconds(rand() % 3));
int ret = dep->Pop();
std::cout << "consumer, Pop: ----------" << ret << std::endl;
// break;
}
}
int main()
{
srand(time(NULL));
LoopQueue<int> queue;
std::future<void> fut1 = std::async(std::launch::async, producer, &queue);
std::future<void> fut2 = std::async(std::launch::async, consumer, &queue);
std::cout << "--------------------------------" << std::endl;
fut1.wait(); // 等待异步结束
fut2.wait(); // 等待异步结束
std::cout << "================================" << std::endl;
}
运行结果:
作者:chacebai
出处:https://www.cnblogs.com/chacebai/p/16424531.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」