/
Maksim_Sadovnikov
/
Executor
Обзор
Документация
Войти
/
Maksim_Sadovnikov
/
Executor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
executor/src/executor.cpp
85 строк
2 KB
Maksim_Sadovnikov
Update code
16 май 2025, 23:29
16 май 2025, 23:29
b6e5a92
Код
Авторство
О чём код?
#include <executor/executor.h> namespace executor { Executor::Executor(size_t numThreads) : workers_() , tasks_() , mutex_() , cv_() , stop_(false) , tasksMap_() , startMutex_() , numThreads_(numThreads) {} Executor::~Executor() { Shutdown(); } std::shared_ptr<Task> Executor::FindTaskById(const std::string& id) { std::lock_guard<std::mutex> lock(mutex_); auto it = tasksMap_.find(id); if (it != tasksMap_.end()) return it->second; return nullptr; } void Executor::Submit(std::shared_ptr<Task> task) { { std::lock_guard<std::mutex> lock(mutex_); task->SetStatus(StatusTask::SCHEDULED); tasks_.push(task); tasksMap_[ task->GetId() ] = task; } cv_.notify_one(); } void Executor::Start() { std::lock_guard<std::mutex> lock(startMutex_); if (!workers_.empty()) return; for (size_t i = 0; i < numThreads_; ++i) { workers_.emplace_back([this]() { WorkerLoop(); }); } } void Executor::Shutdown() { { std::lock_guard<std::mutex> lock(mutex_); stop_ = true; } cv_.notify_all(); for (auto &t : workers_) { if (t.joinable()) t.join(); } workers_.clear(); } void Executor::WorkerLoop() { while (true) { std::shared_ptr<Task> task; { std::unique_lock<std::mutex> lock(mutex_); cv_.wait(lock, [this]() { return stop_ || !tasks_.empty(); }); if (stop_ && tasks_.empty()) return; task = std::move(tasks_.front()); tasks_.pop(); } task->Run(); { std::lock_guard<std::mutex> lock(mutex_); tasksMap_.erase(task->GetId()); } } } } // namespace executor