|
@@ -24,11 +24,12 @@
|
|
|
|
|
|
#include <chrono>
|
|
#include <chrono>
|
|
#include <condition_variable>
|
|
#include <condition_variable>
|
|
|
|
+#include <deque>
|
|
#include <functional>
|
|
#include <functional>
|
|
#include <future>
|
|
#include <future>
|
|
-#include <map>
|
|
|
|
#include <memory>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <mutex>
|
|
|
|
+#include <queue>
|
|
#include <stdexcept>
|
|
#include <stdexcept>
|
|
#include <thread>
|
|
#include <thread>
|
|
#include <vector>
|
|
#include <vector>
|
|
@@ -71,9 +72,16 @@ protected:
|
|
std::function<void()> dequeue(); // returns null function if joining
|
|
std::function<void()> dequeue(); // returns null function if joining
|
|
|
|
|
|
std::vector<std::thread> mWorkers;
|
|
std::vector<std::thread> mWorkers;
|
|
- std::multimap<clock::time_point, std::function<void()>> mTasks;
|
|
|
|
std::atomic<bool> mJoining = false;
|
|
std::atomic<bool> mJoining = false;
|
|
|
|
|
|
|
|
+ struct Task {
|
|
|
|
+ clock::time_point time;
|
|
|
|
+ std::function<void()> func;
|
|
|
|
+ bool operator>(const Task &other) const { return time > other.time; }
|
|
|
|
+ bool operator<(const Task &other) const { return time < other.time; }
|
|
|
|
+ };
|
|
|
|
+ std::priority_queue<Task, std::deque<Task>, std::greater<Task>> mTasks;
|
|
|
|
+
|
|
mutable std::mutex mMutex, mWorkersMutex;
|
|
mutable std::mutex mMutex, mWorkersMutex;
|
|
std::condition_variable mCondition;
|
|
std::condition_variable mCondition;
|
|
};
|
|
};
|
|
@@ -105,7 +113,7 @@ auto ThreadPool::schedule(clock::time_point time, F &&f, Args &&...args)
|
|
});
|
|
});
|
|
std::future<R> result = task->get_future();
|
|
std::future<R> result = task->get_future();
|
|
|
|
|
|
- mTasks.emplace(time, [task = std::move(task), token = Init::Token()]() { return (*task)(); });
|
|
|
|
|
|
+ mTasks.push({time, [task = std::move(task), token = Init::Token()]() { return (*task)(); }});
|
|
mCondition.notify_one();
|
|
mCondition.notify_one();
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|