#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; }