首页 > 其他分享 >一个基于配置文件构建有向无环图,并多线程运行图上节点的例子

一个基于配置文件构建有向无环图,并多线程运行图上节点的例子

时间:2024-03-21 14:44:07浏览次数:29  
标签:std return denpendingNodes 配置文件 运行图 vector shared 多线程 ptr

#include <iostream>
#include <memory>
#include <thread>
#include <vector>

class Node {
public:
  virtual void show() = 0;
  virtual bool hasFinished() { return has_finished_; }

protected:
  bool has_finished_ = false;
};

class A : public Node {
public:
  void show() override {
    std::cout << "In A show()." << std::endl;
    has_finished_ = true;
  }
};

class B : public Node {
public:
  void show() override {
    std::cout << "In B show()." << std::endl;
    has_finished_ = true;
  }
};

class C : public Node {
public:
  void show() override {
    std::cout << "In C show()." << std::endl;
    has_finished_ = true;
  }
};

class D : public Node {
public:
  void show() override {
    std::cout << "In D show()." << std::endl;
    has_finished_ = true;
  }
};

bool hasDependingNodesFinished(
    const std::vector<std::shared_ptr<Node>> &denpendingNodes) {
  for (const std::shared_ptr<Node> denpendingNode : denpendingNodes) {
    if (!(denpendingNode->hasFinished())) {
      return false;
    }
  }
  return true;
}

void runNode(const std::shared_ptr<Node> &node,
             const std::vector<std::shared_ptr<Node>> &denpendingNodes) {
  while (!hasDependingNodesFinished(denpendingNodes)) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }
  node->show();
}

std::vector<
    std::pair<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>>>>
parseGraph() {
  std::shared_ptr<Node> a = std::make_shared<A>();
  std::shared_ptr<Node> b = std::make_shared<B>();
  std::shared_ptr<Node> c = std::make_shared<C>();
  std::shared_ptr<Node> d = std::make_shared<D>();
  std::vector<
      std::pair<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>>>>
      dependencies = {{a, {}}, {b, {}}, {c, {a, b}}, {d, {a, c}}};
  return std::move(dependencies);
}

int main(int argc, char *argv[]) {
  std::vector<
      std::pair<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>>>>
      graph = parseGraph();
  std::vector<std::thread> th;
  for (const auto &[nodeToRun, denpendingNodes] : graph) {
    th.push_back(std::thread(runNode, nodeToRun, denpendingNodes));
  }
  for (auto &t : th) {
    t.join();
  }
  return 1;
}

  

标签:std,return,denpendingNodes,配置文件,运行图,vector,shared,多线程,ptr
From: https://www.cnblogs.com/qiandeheng/p/18087358

相关文章

  • C# 多线程锁
    C#多线程锁分类lock(Monitor):lock是C#中的关键字,它实际上是Monitor类的一个简化版本的语法糖。使用方式:lock(obj){//代码块},其中obj是一个对象引用,所有线程都试图获取该对象的互斥锁。功能:确保同一时间只有一个线程可以进入受保护的代码块。应用场景:适用......
  • 多线程:乐观锁
     悲观锁:一上来就加锁,没有安全感。每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差!乐观锁:一开始不上锁,认为是没有问题的,大家一起跑,等要出现线程安全问题的时候才开始控制。线程安全,性能较好。为什么出现线程安全问题?100个线程每个加100次应该加10000次才对;因为......
  • Java-Java基础学习(3)-多线程(1)
    Java-Java基础学习(4)-多线程(1)3.多线程在Java中,多线程主要的实现方式有四种:继承Thread类、实现Runnable接口、实现Callable接口经过FutureTask包装器来建立Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。3.1.四种创建方式Threadclass==>......
  • redis自学(22)Redis是单线程还是多线程?
    Redis是单线程还是多线程?Redis到底是单线程还是多线程? 如果仅仅聊Redis的核心的业务处理部分(命令处理),答案是单线程 如果是聊整个Redis那么答案是对线程在Redis版本迭代过程中,在两个重要的时间节点上引入了多线程的支持:Redisv4.0:引入多线程异步处理一些耗时较长的任务,......
  • windows下启停jar并指定application.yml配置文件
    启动脚本start.bat@echooffREM设置jar文件名和application.yml文件名setJAR_FILE=xxx-boot.jarsetYML_FILE=application-prod.ymlsetACTIVE=prodsetPORT=8080REM启动jar:startjava-jar%JAR_FILE%--server.port=%PORT%--spring.profiles.active=%ACTIVE%--s......
  • Python配置文件使用教程
    在Python应用程序开发过程中,配置文件扮演着重要的角色。配置文件可以用来存储应用程序的各种设置、选项和参数,使得程序更加灵活和可配置。本文将介绍Python中如何使用配置文件,并提供一些常见的配置文件处理方法。一、配置文件格式常见的配置文件格式有多种,包括INI格式、J......
  • Python配置文件使用教程
    在Python应用程序开发过程中,配置文件扮演着重要的角色。配置文件可以用来存储应用程序的各种设置、选项和参数,使得程序更加灵活和可配置。本文将介绍Python中如何使用配置文件,并提供一些常见的配置文件处理方法。一、配置文件格式常见的配置文件格式有多种,包括INI格式、JS......
  • JAVASE各模块结构图:面向对象、常用类、多线程、异常、IO流、集合、网络编程
    ......
  • 深入浅出Java多线程(十三):阻塞队列
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程的世界里,生产者-消费者问题是一个经典且频繁出现的场景。设想这样一个情况:有一群持续不断地生产资源的线程(我们称之......
  • 常用开发工具系统环境变量及配置文件
    环境变量EnvironmentVariables用户变量IntelliJIDEAC:\Developer\JetBrains\IntelliJIDEA2021.2.1\bin;Path%IntelliJIDEA%系统变量TomcatCATALINA_BASEC:\Developer\Tomcat\tomcat64-9.0.65CATALINA_HOMEC:\Developer\Tomca......