当前位置: 首页 > news >正文

FastFlow(3)---有序FARM

1)正常的FARM

下面的编译选项NOT_ORDERD

保证了ff_Farm

#include <vector>
#include <ff/farm.hpp>
#include <ff/pipeline.hpp>
#include <iostream>

#define NOT_ORDERED

using namespace ff;
typedef std::pair<long, long> fftask_t;

struct Start : ff_node_t<fftask_t> {
    Start(long streamlen) : streamlen(streamlen) {}
    fftask_t *svc(fftask_t *) {
        for (long j = 0; j < streamlen; j++) {
            ff_send_out(new std::pair<long, long>(random() % 2000, j));
        }
        return  EOS;
    }
    long streamlen;
};

struct Worker : ff_node_t<fftask_t> {
    fftask_t *svc(fftask_t *task) {
        for (volatile long j = task->first; j>0; --j);
        return  task;
    }
};

struct Stop : ff_node_t<fftask_t> {
    int svc_init() { expected = 0; return 0; }
    fftask_t *svc(fftask_t *task) {
        if (task->second != expected)
            std::cerr << "ERROR: tasks received out of order, received "
            << task->second << " expected " << expected << "\n";
        else
            std::cout << "received " << task->second << "\n";
        expected++;
        delete task;
        return GO_ON;
    }
    long expected;
};

int main() {
    long nworkers = 2, streamlen = 10;
    srandom(1);

    Start start(streamlen);
    Stop stop;
    std::vector<std::unique_ptr<ff_node> > W;
    for (int i = 0; i < nworkers; ++i)
        W.push_back(make_unique<Worker>());

#if defined(NOT_ORDERED)
    ff_Farm<> ofarm(std::move(W));
#else
    ff_OFarm<> ofarm(std::move(W));
#endif
    ff_Pipe<> pipe(start,ofarm, stop);
    if (pipe.run_and_wait_end() < 0) error("running pipe\n");

    return 0;
}

运行结果:

 2)有序FARM

去除编译选项NOT_ORDERED, 用到ff_OFarm

#include <vector>
#include <ff/farm.hpp>
#include <ff/pipeline.hpp>
#include <iostream>

//#define NOT_ORDERED

using namespace ff;
typedef std::pair<long, long> fftask_t;

struct Start : ff_node_t<fftask_t> {
    Start(long streamlen) : streamlen(streamlen) {}
    fftask_t *svc(fftask_t *) {
        for (long j = 0; j < streamlen; j++) {
            ff_send_out(new std::pair<long, long>(random() % 2000, j));
        }
        return  EOS;
    }
    long streamlen;
};

struct Worker : ff_node_t<fftask_t> {
    fftask_t *svc(fftask_t *task) {
        for (volatile long j = task->first; j>0; --j);
        return  task;
    }
};

struct Stop : ff_node_t<fftask_t> {
    int svc_init() { expected = 0; return 0; }
    fftask_t *svc(fftask_t *task) {
        if (task->second != expected)
            std::cerr << "ERROR: tasks received out of order, received "
            << task->second << " expected " << expected << "\n";
        else
            std::cout << "received " << task->second << "\n";
        expected++;
        delete task;
        return GO_ON;
    }
    long expected;
};

int main() {
    long nworkers = 2, streamlen = 10;
    srandom(1);

    Start start(streamlen);
    Stop stop;
    std::vector<std::unique_ptr<ff_node> > W;
    for (int i = 0; i < nworkers; ++i)
        W.push_back(make_unique<Worker>());

#if defined(NOT_ORDERED)
    ff_Farm<> ofarm(std::move(W));
#else
    ff_OFarm<> ofarm(std::move(W));
#endif
    ff_Pipe<> pipe(start,ofarm, stop);
    if (pipe.run_and_wait_end() < 0) error("running pipe\n");

    return 0;
}

运行结果:

 

相关文章:

  • Springboot餐饮点餐系统毕业设计源码301749
  • 借身份证给别人办理流量卡有风险吗?这些情况你必须要知道!
  • 概述LCR测试仪IM3536日本HIOKI日置IM3535 阻抗分析仪
  • qiankun微应用加载第三方js、sdk跨域报错
  • Linux网络编程-网络层IP协议
  • 神经网络图像识别代码,编码解码神经网络
  • 5分钟从掌握到精通---进制转化
  • centos安装zabbix
  • 前缀和以及哈希表优化
  • 【JavaSE】多线程篇(一)线程的相关概念与线程的基本使用
  • 8、学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程
  • 数据库基本结论
  • Django-(3)
  • HyperLynx(十五)多板仿真
  • ElasticSearch(四):ES nested嵌套文档与父子文档处理
  • “大数据应用场景”之隔壁老王(连载四)
  • centos安装java运行环境jdk+tomcat
  • JavaScript设计模式之工厂模式
  • js 实现textarea输入字数提示
  • JS变量作用域
  • JS函数式编程 数组部分风格 ES6版
  • MaxCompute访问TableStore(OTS) 数据
  • mysql_config not found
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React 快速上手 - 07 前端路由 react-router
  • Spring框架之我见(三)——IOC、AOP
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从setTimeout-setInterval看JS线程
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊flink的TableFactory
  • 数据仓库的几种建模方法
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2.2w字)前端单元测试之Jest详解篇
  • (c语言)strcpy函数用法
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)hibernate配置管理
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (四)Linux Shell编程——输入输出重定向
  • (一)VirtualBox安装增强功能
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net MVC + EF搭建学生管理系统
  • .Net 路由处理厉害了
  • .net 使用ajax控件后如何调用前端脚本
  • .net访问oracle数据库性能问题
  • @EventListener注解使用说明
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @软考考生,这份软考高分攻略你须知道
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • []指针
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory