From a30f64ef494d035ae3dbd667a90a280044b9f592 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Sun, 4 Feb 2024 13:46:06 +0100 Subject: [PATCH] Core/TaskScheduler: Increase shutdown performance Tell all threads to exit and join them all at once instead of one by one --- src/Nazara/Core/TaskScheduler.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Nazara/Core/TaskScheduler.cpp b/src/Nazara/Core/TaskScheduler.cpp index 6a75f1c14..6f1fcacf9 100644 --- a/src/Nazara/Core/TaskScheduler.cpp +++ b/src/Nazara/Core/TaskScheduler.cpp @@ -96,10 +96,6 @@ namespace Nz ~Worker() { - m_running = false; - if (!m_notifier.test_and_set()) - m_notifier.notify_one(); - m_thread.join(); } @@ -170,6 +166,13 @@ namespace Nz } } + void Shutdown() + { + m_running = false; + if (!m_notifier.test_and_set()) + m_notifier.notify_one(); + } + TaskScheduler::Task* StealTask() { return m_tasks.steal(); @@ -214,12 +217,17 @@ namespace Nz for (unsigned int i = 0; i < m_workerCount; ++i) m_workers.emplace_back(*this, i); - for (unsigned int i = 0; i < m_workerCount; ++i) - m_workers[i].WakeUp(); + for (Worker& worker : m_workers) + worker.WakeUp(); } TaskScheduler::~TaskScheduler() { + // Wake up workers and tell them to exit + for (Worker& worker : m_workers) + worker.Shutdown(); + + // wait for them to have exited m_workers.clear(); }