Core/TaskScheduler: Fix AddTask

This commit is contained in:
SirLynix 2024-02-01 09:53:17 +01:00
parent 5d6a094bfe
commit 369f273894
2 changed files with 12 additions and 9 deletions

View File

@ -12,7 +12,6 @@
#include <atomic> #include <atomic>
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <random>
namespace Nz namespace Nz
{ {
@ -45,7 +44,7 @@ namespace Nz
std::atomic_bool m_idle; std::atomic_bool m_idle;
std::atomic_uint m_idleWorkerCount; std::atomic_uint m_idleWorkerCount;
std::minstd_rand m_randomGenerator; std::size_t m_nextWorkerIndex;
std::vector<Worker> m_workers; std::vector<Worker> m_workers;
}; };
} }

View File

@ -18,14 +18,16 @@ namespace Nz
NAZARA_WARNING_PUSH() NAZARA_WARNING_PUSH()
NAZARA_WARNING_MSVC_DISABLE(4324) NAZARA_WARNING_MSVC_DISABLE(4324)
namespace NAZARA_ANONYMOUS_NAMESPACE
{
#ifdef __cpp_lib_hardware_interference_size #ifdef __cpp_lib_hardware_interference_size
using std::hardware_destructive_interference_size; using std::hardware_destructive_interference_size;
#else #else
constexpr std::size_t hardware_destructive_interference_size = 64; constexpr std::size_t hardware_destructive_interference_size = 64;
#endif #endif
}
class alignas(NAZARA_ANONYMOUS_NAMESPACE_PREFIX(hardware_destructive_interference_size)) TaskScheduler::Worker
class alignas(hardware_destructive_interference_size) TaskScheduler::Worker
{ {
public: public:
Worker(TaskScheduler& owner, unsigned int workerIndex) : Worker(TaskScheduler& owner, unsigned int workerIndex) :
@ -179,7 +181,7 @@ namespace Nz
TaskScheduler::TaskScheduler(unsigned int workerCount) : TaskScheduler::TaskScheduler(unsigned int workerCount) :
m_idle(true), m_idle(true),
m_randomGenerator(std::random_device{}()) m_nextWorkerIndex(0)
{ {
if (workerCount == 0) if (workerCount == 0)
workerCount = std::max(Core::Instance()->GetHardwareInfo().GetCpuThreadCount(), 1u); workerCount = std::max(Core::Instance()->GetHardwareInfo().GetCpuThreadCount(), 1u);
@ -200,12 +202,14 @@ namespace Nz
{ {
m_idle = false; m_idle = false;
std::uniform_int_distribution<unsigned int> workerDis(0, static_cast<unsigned int>(m_workers.size() - 1));
for (;;) for (;;)
{ {
Worker& randomWorker = m_workers[workerDis(m_randomGenerator)]; Worker& randomWorker = m_workers[m_nextWorkerIndex];
if (randomWorker.AddTask(std::move(task))) if (randomWorker.AddTask(std::move(task)))
break; break;
if (++m_nextWorkerIndex >= m_workers.size())
m_nextWorkerIndex = 0;
} }
} }