Add lock to parallel task class

This commit is contained in:
Sezz 2025-02-14 04:25:55 +11:00
parent 918237113f
commit 455d547de7
2 changed files with 13 additions and 8 deletions

View file

@ -70,10 +70,10 @@ namespace TEN::Utils
std::future<void> ParallelTaskManager::AddTask(const ParallelTask& task)
{
return AddTasks(ParallelTaskGroup{ task });
return AddTasks(ParallelTasks{ task });
}
std::future<void> ParallelTaskManager::AddTasks(const ParallelTaskGroup& tasks)
std::future<void> ParallelTaskManager::AddTasks(const ParallelTasks& tasks)
{
// HEAP ALLOC: Create counter and promise.
auto counter = std::make_shared<std::atomic<int>>();
@ -97,7 +97,7 @@ namespace TEN::Utils
// TODO: Make this a configuration option?
constexpr auto SERIAL_UNIT_COUNT_MAX = 32;
auto tasks = ParallelTaskGroup{};
auto tasks = ParallelTasks{};
// Process in parallel.
if (g_GameFlow->GetSettings()->System.Multithreaded &&
@ -156,8 +156,13 @@ namespace TEN::Utils
// Increment counter for task group.
counter->fetch_add(1, std::memory_order_relaxed);
// Add task with promise and counter handling.
_tasks.push([this, task, counter, promise]() { HandleTask(task, *counter, *promise); });
// LOCK: Restrict task queue access.
{
auto taskLock = std::unique_lock(_taskMutex);
// Add task with promise and counter handling.
_tasks.push([this, task, counter, promise]() { HandleTask(task, *counter, *promise); });
}
}
void ParallelTaskManager::HandleTask(const ParallelTask& task, std::atomic<int>& counter, std::promise<void>& promise)

View file

@ -2,8 +2,8 @@
namespace TEN::Utils
{
using ParallelTask = std::function<void()>;
using ParallelTaskGroup = std::vector<ParallelTask>;
using ParallelTask = std::function<void()>;
using ParallelTasks = std::vector<ParallelTask>;
class ParallelTaskManager
{
@ -35,7 +35,7 @@ namespace TEN::Utils
void Initialize();
std::future<void> AddTask(const ParallelTask& task);
std::future<void> AddTasks(const ParallelTaskGroup& tasks);
std::future<void> AddTasks(const ParallelTasks& tasks);
std::future<void> AddTasks(int elementCount, const std::function<void(int, int)>& splitTask);
private: