mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Add lock to parallel task class
This commit is contained in:
parent
918237113f
commit
455d547de7
2 changed files with 13 additions and 8 deletions
|
@ -70,10 +70,10 @@ namespace TEN::Utils
|
||||||
|
|
||||||
std::future<void> ParallelTaskManager::AddTask(const ParallelTask& task)
|
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.
|
// HEAP ALLOC: Create counter and promise.
|
||||||
auto counter = std::make_shared<std::atomic<int>>();
|
auto counter = std::make_shared<std::atomic<int>>();
|
||||||
|
@ -97,7 +97,7 @@ namespace TEN::Utils
|
||||||
// TODO: Make this a configuration option?
|
// TODO: Make this a configuration option?
|
||||||
constexpr auto SERIAL_UNIT_COUNT_MAX = 32;
|
constexpr auto SERIAL_UNIT_COUNT_MAX = 32;
|
||||||
|
|
||||||
auto tasks = ParallelTaskGroup{};
|
auto tasks = ParallelTasks{};
|
||||||
|
|
||||||
// Process in parallel.
|
// Process in parallel.
|
||||||
if (g_GameFlow->GetSettings()->System.Multithreaded &&
|
if (g_GameFlow->GetSettings()->System.Multithreaded &&
|
||||||
|
@ -156,8 +156,13 @@ namespace TEN::Utils
|
||||||
// Increment counter for task group.
|
// Increment counter for task group.
|
||||||
counter->fetch_add(1, std::memory_order_relaxed);
|
counter->fetch_add(1, std::memory_order_relaxed);
|
||||||
|
|
||||||
// Add task with promise and counter handling.
|
// LOCK: Restrict task queue access.
|
||||||
_tasks.push([this, task, counter, promise]() { HandleTask(task, *counter, *promise); });
|
{
|
||||||
|
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)
|
void ParallelTaskManager::HandleTask(const ParallelTask& task, std::atomic<int>& counter, std::promise<void>& promise)
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
namespace TEN::Utils
|
namespace TEN::Utils
|
||||||
{
|
{
|
||||||
using ParallelTask = std::function<void()>;
|
using ParallelTask = std::function<void()>;
|
||||||
using ParallelTaskGroup = std::vector<ParallelTask>;
|
using ParallelTasks = std::vector<ParallelTask>;
|
||||||
|
|
||||||
class ParallelTaskManager
|
class ParallelTaskManager
|
||||||
{
|
{
|
||||||
|
@ -35,7 +35,7 @@ namespace TEN::Utils
|
||||||
void Initialize();
|
void Initialize();
|
||||||
|
|
||||||
std::future<void> AddTask(const ParallelTask& task);
|
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);
|
std::future<void> AddTasks(int elementCount, const std::function<void(int, int)>& splitTask);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue