Checkpoint

This commit is contained in:
Ian Roddis
2021-06-16 13:55:17 -03:00
parent 01517f3421
commit 5e3098c5f9
2 changed files with 10 additions and 8 deletions

View File

@@ -22,10 +22,12 @@ namespace daggy {
std::future<void> addTask(AsyncTask fn);
private:
using QueuedAsyncTask = std::shared_ptr<AsyncTask>;
std::atomic<bool> shutdown_;
std::mutex guard_;
std::condition_variable cv_;
std::vector<std::thread> workers_;
std::deque<AsyncTask> taskQueue_;
std::deque<QueuedAsyncTask> taskQueue_;
};
}

View File

@@ -8,17 +8,16 @@ ThreadPool::ThreadPool(size_t nWorkers) {
for (size_t i = 0; i < nWorkers; ++i) {
workers_.emplace_back([&]() {
while (true) {
AsyncTask tsk;
QueuedAsyncTask tsk;
{
std::unique_lock<std::mutex> lk(guard_);
cv_.wait(lk, []{ return true; });
if (shutdown_) return;
tsk = taskQueue_.front();
tsk.swap(taskQueue_.front());
taskQueue_.pop_front();
}
tsk();
(*tsk)();
}
});
}
@@ -38,11 +37,12 @@ void ThreadPool::shutdown() {
}
std::future<void> ThreadPool::addTask(std::function<void()> fn) {
std::packaged_task<void()> task(fn);
std::future<void> result = task.get_future();
auto task = std::make_shared<std::packaged_task<void()>>(fn);
std::future<void> result = task->get_future();
{
std::unique_lock<std::mutex> lk(guard_);
taskQueue_.push_back(std::move(task));
taskQueue_.emplace_back(std::move(task));
}
cv_.notify_one();
return result;
}