Checkpoint
This commit is contained in:
@@ -22,10 +22,12 @@ namespace daggy {
|
|||||||
|
|
||||||
std::future<void> addTask(AsyncTask fn);
|
std::future<void> addTask(AsyncTask fn);
|
||||||
private:
|
private:
|
||||||
|
using QueuedAsyncTask = std::shared_ptr<AsyncTask>;
|
||||||
|
|
||||||
std::atomic<bool> shutdown_;
|
std::atomic<bool> shutdown_;
|
||||||
std::mutex guard_;
|
std::mutex guard_;
|
||||||
std::condition_variable cv_;
|
std::condition_variable cv_;
|
||||||
std::vector<std::thread> workers_;
|
std::vector<std::thread> workers_;
|
||||||
std::deque<AsyncTask> taskQueue_;
|
std::deque<QueuedAsyncTask> taskQueue_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,17 +8,16 @@ ThreadPool::ThreadPool(size_t nWorkers) {
|
|||||||
for (size_t i = 0; i < nWorkers; ++i) {
|
for (size_t i = 0; i < nWorkers; ++i) {
|
||||||
workers_.emplace_back([&]() {
|
workers_.emplace_back([&]() {
|
||||||
while (true) {
|
while (true) {
|
||||||
AsyncTask tsk;
|
QueuedAsyncTask tsk;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(guard_);
|
std::unique_lock<std::mutex> lk(guard_);
|
||||||
cv_.wait(lk, []{ return true; });
|
cv_.wait(lk, []{ return true; });
|
||||||
if (shutdown_) return;
|
if (shutdown_) return;
|
||||||
tsk = taskQueue_.front();
|
tsk.swap(taskQueue_.front());
|
||||||
taskQueue_.pop_front();
|
taskQueue_.pop_front();
|
||||||
}
|
}
|
||||||
|
|
||||||
tsk();
|
(*tsk)();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -38,11 +37,12 @@ void ThreadPool::shutdown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::future<void> ThreadPool::addTask(std::function<void()> fn) {
|
std::future<void> ThreadPool::addTask(std::function<void()> fn) {
|
||||||
std::packaged_task<void()> task(fn);
|
auto task = std::make_shared<std::packaged_task<void()>>(fn);
|
||||||
std::future<void> result = task.get_future();
|
std::future<void> result = task->get_future();
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(guard_);
|
std::unique_lock<std::mutex> lk(guard_);
|
||||||
taskQueue_.push_back(std::move(task));
|
taskQueue_.emplace_back(std::move(task));
|
||||||
}
|
}
|
||||||
cv_.notify_one();
|
cv_.notify_one();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user