使用c++11重新实现producer和consumer模型
来源:互联网 发布:韦德季后赛数据 编辑:程序博客网 时间:2024/05/16 23:22
作为一名程序员,我想我们应该都写过producer和consumer的模型,应为他的用途实在是太广泛了,比如之前服务器里使用到的actor队列,还有一些对于计算量比较大的任务,都是前端快速接受请求,放到队列,然后后面的线程池取出队列执行并异步返回,都是使用的producer和consumer方式来实现的,我简单的画了一张图:
在代码层面的实现无非是用一个队列,然后再producer和consumer在写入和读取时两端加锁,使用condition实现等待,以此来协调producer,consumer的工作,如果用一个现实生活中的例子来解释的话,就像是代理销售产品,producer就是工厂,中间的队列就是代理商,我们就是消费者,从运营成本上来讲,这种方式加大了消费者的支出,因为代理商要获得收益,那可不可以我们直接去工厂预定他们的产品,然后根据每一个用户们的需求在原来的基础上再DIY一下,最后给consumer呢,答案是可以的,而且还能保证绝对的公平,不信你可以看下面实现:
使用c++中的function/async/promise/packaged_task说白了就是异步回调函数,和feture来实现这种模型。
下面是伪代码的实现,看得懂就ok了
生产者,如果你想的话可以做成一个队列
class producer
{
public:
void operator()()
{
// 一步等待任务
// 任务来了,打包成package,然后使用round robbins算法调用funcs里面的一个callback就ok了其他的不用管,如callback(package)
}
void register(callback a)
{
funcs.push_back(a);
}
private
queue<callback> funcs; //callback 可以为上面说到的异步回调函数中的任何一种,我下面用到的是
}
producer farms;
// 用户1,以及自定义的DIY函数
void task_lambda(){
// Res为DIYpackage之后返回的类型,这个根据需求定std::packaged_task<Res (package)> task([](package candy) {return candy; });
std::future<int> result = task.get_future();
while (true)
{ farms.register(task); std::cout << "task_lambda:\t" << result.get() << '\n';
}}
// 用户2的DIY
Res f(package a)
{
return process(a);
}
void task_bind(){ std::packaged_task<Res(package)> task(std::bind(f, _1)); std::future<int> result = task.get_future(); while (true)
{ std::cout << "task_bind:\t" << result.get() << '\n';
}}//用户3的DIY
Res func(package a)
{
return process1(a);
}
void task_thread(){ std::packaged_task<Res(package)> task(func); std::future<int> result = task.get_future(); while (true)
{ std::cout << "task_thread:\t" << result.get() << '\n';
}}
// 可以开始启动工作了int main(){ boost::thread th1(boost::bind(task_lambda)); boost::thread th2(task_bind); boost::thread th3(task_thread);
th1.join();
th2.join();
th3.join();}
甩掉代理商的感觉怎么样,简单而且容易实现,这里还用到了函数式编程的思想,从c++的标准的演变来看,感觉c++从注重语法到现在注重应用的趋势越来越明显,当然这只是为了我们能够更简单,更快捷的开发我们的程序,以上是一些小的体验和心得,欢迎大家一起沟通交流。
- 使用c++11重新实现producer和consumer模型
- Producer-Consumer模型:二、如何实现
- spring集成kafka实现producer和consumer
- spring集成kafka实现producer和consumer
- 并发编程实现模型之(三)Producer-Consumer模式
- Producer-Consumer模型:一、简介
- kafka学习笔记 --- Scala实现Kafka producer 和 consumer
- Producer-Consumer的Ruby实现
- Java中实现Consumer-Producer
- Kafka的Producer和Consumer的示例(使用java语言)
- Kafka的Producer和Consumer的示例(使用java语言)
- Kafka使用Java进行Producer和Consumer编程
- Kafka的 Consumer和Producer
- producer consumer
- producer & consumer
- practical haskell: producer-consumer多线程的实现
- practical haskell: producer-consumer多线程的实现
- Java:多线程Producer-Consumer的多种实现
- java中的length属性和length()方法和size()方法
- android adt使用外部图片资源
- C# 3.0 介绍(六) - 用object的动态查询与保存log篇
- jquery-json插件
- R语言十二本书
- 使用c++11重新实现producer和consumer模型
- LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 关于报错You cannot combine custom titles with other title features
- android 布局类的属性
- sql,insert语句出错
- 像素和Dpi的关系
- C# 3.0 介绍(七) - 动态查询续及CLR与SQL在某些细节上的差别
- C语言堆栈入门——堆和栈的区别
- 消息栏通知(Notification)介绍