Core/TaskScheduler: Fix AddTask
This commit is contained in:
parent
5d6a094bfe
commit
369f273894
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue