diff --git a/src/scheduler/ParallelScheduler.cpp b/src/scheduler/ParallelScheduler.cpp
index 4e515099006b9e0588eafc7e981c5f5e80bbe97d..1d70646b70091e2e3ff6f03b8ee82ae62aeb1e43 100644
--- a/src/scheduler/ParallelScheduler.cpp
+++ b/src/scheduler/ParallelScheduler.cpp
@@ -127,7 +127,12 @@ void Aidge::ParallelScheduler::forward(bool forwardDims, const std::vector<std::
         // in the next step
         for (size_t i = 0; i < staticSchedule.size(); ) {
             auto runnable = staticSchedule[i];
-            if (!pool.busy() && runnable->early <= latest) {
+            if (runnable->early > latest) {
+                // No more node can be run at this step (latest)
+                break;
+            }
+
+            if (!pool.busy()) {
                 // Check that potential preceding non-critical nodes are finished
                 bool ready = true;
                 for (auto elt : runnable->laterThan) {
@@ -168,9 +173,17 @@ void Aidge::ParallelScheduler::forward(bool forwardDims, const std::vector<std::
                 }
             }
             else {
-                // Thread pool is already full or no more node can be run at
-                // this step (latest)
-                break;
+                // Thread pool is already full
+                bool ready = true;
+                for (auto elt : mustFinish) {
+                    ready = ready && finished.at(elt);
+                }
+                if (!ready) {
+                    std::this_thread::yield();
+                }
+                else {
+                    break;
+                }
             }
         }