流水线本来是工程任务中为了将不同的工序分开的一种处理流程。这种分工,会给工作的流程化和吞吐带来一定的好处。
如果将流水线应用到程序中,会有如下一些好处:
1、不需要锁。线程之间有时序关系,因此从流程设计上就规避了锁的机制;
2、多线程并发。不同线程负责不同的事务处理,可以在一定程度上实现并发;
3、吞吐量高。由于多线程不会像单线程那样阻塞,所以吞吐量会有一定提高。
但流水线也有它的缺点:
1、处理有时序。这就要求对整个处理流程能够正确划分,不要出现处理不均衡的情况;
2、由于无锁的设计,对开发要求比较高。如果用法不当,容易出现多线程的死锁。

总体来说,流水线不管是对性能还是开发人员来说,都是很好的一种方法,能够让程序像人一样思考,分段处理。
下面,实现一个超级简易的样例,共同学习。

#ifndef PIPE_MY_PIPELINE
#define PIPE_MY_PIPELINE#include <iostream>
#include <vector>
#include <map>
#include "my_message.h"/**
消息驱动
**/
class IPipeBase
{public:virtual void process(MyMessage* msg) = 0;
};class PipeBase : public IPipeBase
{
public:
virtual void forward(MyMessage* msg)
{for (int i = 0; i < next_pipes_.size(); ++i){// 将msg丢给所有的下一级流水线处理next_pipes_[i]->process(msg); }
}void insert_next(IPipeBase* pipe)
{next_pipes_.push_back(pipe);
}protected:
std::vector<IPipeBase*> next_pipes_;
};class MyPipeline
{
public:bool insert_pipeline_seq(PipeBase* source, PipeBase* dest)
{source->insert_next(dest);
}};#endif

主程序测试样例:
#include
#include “my_pipeline.h”
#include “test_mypipeline.h”
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */

int main(int argc, char** argv) {PipeStart* start = new PipeStart();PipeEnd1* end1 = new PipeEnd1();PipeEnd2* end2 = new PipeEnd2();Pipe1* pipe1 = new Pipe1();Pipe2* pipe2 = new Pipe2(); Pipe3* pipe3 = new Pipe3(); Pipe4* pipe4 = new Pipe4(); Pipe5* pipe5 = new Pipe5(); MyPipeline* mypipeline = new MyPipeline();mypipeline->insert_pipeline_seq(start, pipe1); mypipeline->insert_pipeline_seq(start, pipe2); mypipeline->insert_pipeline_seq(pipe1, pipe3); mypipeline->insert_pipeline_seq(pipe1, pipe4); mypipeline->insert_pipeline_seq(pipe2, pipe5);mypipeline->insert_pipeline_seq(pipe4, pipe5); mypipeline->insert_pipeline_seq(pipe3, end1); mypipeline->insert_pipeline_seq(pipe4, end1); mypipeline->insert_pipeline_seq(pipe5, end2); MyMessage* msg = new MyMessage();msg->set_value(0);start->process(msg);return 0;
}

该样例的流水线设计如下:

S - 1 - 3 - E1
| | |
2 4 -------->
| |
—>5 ---->E2

C++流水线的简易实现相关推荐

  1. 设计一个简易的处理器(8)--流水线冒险的避免

    上一篇已经介绍了流水线的相关和冒险,本篇介绍避免流水线冒险几种技术. 暂停技术(Stalling)避免数据冒险 ---- 通过上一篇的介绍,PIPELINE的数据冒险只发生在读/取同一个程序寄存器的时 ...

  2. 【项目自动发布】基于Docker/单节点Rancher/GitLab搭建简易的CI/CD流水线(备忘+补充完善)

    前言 最近面试好像也经常问到一个问题: 你们项目是怎么发布的 传统的Java项目都是本地打包成 jar包 或者 war包, 上传到服务器, 然后通过shell脚本的方式启动的 要求我们具备一定的she ...

  3. socketserver模块用法,多道技术、 基于UDP的简易版QQ

    复习 1.OSI七层2.以太网协议3.ip协议(arp协议)4.TCP5.UDP OSI七层 应表会 # 应用层 (HTTP协议, FTP协议)传输层 # 端口协议 在此层发挥作用网络层 # IP协议 ...

  4. 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、WebSocket、JavaFX 、多线程技术等

    简易 IM 双向通信电脑端 GUI 应用--基于 Netty.WebSocket.JavaFX .多线程技术等 说明 运行效果 核心代码 完整代码 参考知识 说明   这是一款使用 Netty 来实现 ...

  5. 探讨TensorRT加速AI模型的简易方案 — 以图像超分为例

    AI模型近年来被广泛应用于图像.视频处理,并在超分.降噪.插帧等应用中展现了良好的效果.但由于图像AI模型的计算量大,即便部署在GPU上,有时仍达不到理想的运行速度.为此,NVIDIA推出了Tenso ...

  6. GraphicsLab Project之简易贴画系统(Decal System)

    作者:i_dovelemon 日期:2018-08-28 来源:CSDN 主题:Projection Texture Mapping, Decal System 引言 游戏开发过程中有一个非常重要的功 ...

  7. Python爬虫+简易词云的制作

    Python爬虫+简易词云的制作 写在前面 再识Python 简介: 应用场景: Python命令行执行: 基本语法: 连接数据库: Python爬虫 主要步骤: 第一种爬虫:urllib基本库+Be ...

  8. [源码解析] PyTorch 流水线并行实现 (1)--基础知识

    [源码解析] PyTorch 流水线并行实现 (1)–基础知识 文章目录 [源码解析] PyTorch 流水线并行实现 (1)--基础知识 0x00 摘要 0x01 历史 1.1 GPipe 1.2 ...

  9. 从简易计算器到设计模式(策略、简单工厂)

    前言 最近在拜读<大话设计模式>这本书,作为一个小白中的小白,读完以后感触还是很深的.再次做一个学习的记录,同时也算给自己多一次实践的机会. 问题 相信大家在上学时都写过"简易计 ...

最新文章

  1. UVA 11491 Erasing and Winning 奖品的价值 (贪心)
  2. redis集群扩容和缩容_redis集群cluster搭建,扩容缩容
  3. 人人可用的AI大模型来了,“玩”TA还有奖金拿
  4. 设置Linux虚拟机和主机在同一网段
  5. 深入理解Java虚拟机——第十二章——Java内存模型与线程
  6. 医学图像处理期末复习(一)
  7. 纪中C组模拟赛总结(2019.9.7)
  8. 小窍门解决大问题(组图)
  9. MySQL查询执行的基础——查询优化处理
  10. [转]隐马尔可夫模型
  11. 阿里云云计算 40 CDN的概念
  12. eclipse添加约束文件
  13. python自动生成word目录_python win32com 库批量自动更新word目录
  14. Java实现生产者消费者的PV操作信号量操作
  15. 拟一维喷管流动的数值解——全亚声速等熵喷管流动的非守恒型CFD解法(MacCormack方法)
  16. 微信官方多端框架Donut可将小程序编译成 Android 以及 iOS 应用了
  17. 解决Win10局域网共享问题:请检查名称的拼写 否则 网络...
  18. SpringMVC(7)——类型转换器Converter
  19. android 蘑菇街组件化,蘑菇街 App 的组件化之路
  20. 如何新建盟军敢死队2地图

热门文章

  1. 右键打开方式添加应用程序无法设置
  2. Fatal error in launcher: Unable to create process using ''之解决办法
  3. Web.xml详解(转)
  4. Python Cookbook 资料链接
  5. SQL Server 中的执行计划和SQL Server Profiler
  6. 解题报告 『[Poetize6]IncDec Sequence(差分)』
  7. BigDecimal加减乘除
  8. LeetCode 134 Gas Station
  9. linux 虚拟机设置好固定ip 修改了 dns 网络需要设置成桥接模式
  10. 结对编程1-基于GUI的四则运算生成器