17 #ifndef CYBER_BASE_THREAD_POOL_H_ 18 #define CYBER_BASE_THREAD_POOL_H_ 38 explicit ThreadPool(std::size_t thread_num, std::size_t max_task_num = 1000);
40 template <
typename F,
typename... Args>
41 auto Enqueue(F&& f, Args&&... args)
42 -> std::future<
typename std::result_of<F(Args...)>::type>;
47 std::vector<std::thread> workers_;
49 std::atomic_bool stop_;
55 throw std::runtime_error(
"Task queue init failed.");
57 workers_.reserve(threads);
58 for (
size_t i = 0; i < threads; ++i) {
59 workers_.emplace_back([
this] {
61 std::function<void()> task;
71 template <
typename F,
typename... Args>
73 -> std::future<
typename std::result_of<F(Args...)>::type> {
74 using return_type =
typename std::result_of<F(Args...)>::type;
76 auto task = std::make_shared<std::packaged_task<return_type()>>(
77 std::bind(std::forward<F>(f), std::forward<Args>(args)...));
79 std::future<return_type> res = task->get_future();
83 return std::future<return_type>();
85 task_queue_.
Enqueue([task]() { (*task)(); });
91 if (stop_.exchange(
true)) {
95 for (std::thread& worker : workers_) {
104 #endif // CYBER_BASE_THREAD_POOL_H_ bool Init(uint64_t size)
Definition: bounded_queue.h:90
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
Definition: thread_pool.h:36
bool Enqueue(const T &element)
Definition: bounded_queue.h:110
Definition: bounded_queue.h:37
void BreakAllWait()
Definition: bounded_queue.h:240
auto Enqueue(F &&f, Args &&... args) -> std::future< typename std::result_of< F(Args...)>::type >
Definition: thread_pool.h:72
ThreadPool(std::size_t thread_num, std::size_t max_task_num=1000)
Definition: thread_pool.h:52
bool WaitDequeue(T *element)
Definition: bounded_queue.h:204
~ThreadPool()
Definition: thread_pool.h:90
Definition: wait_strategy.h:38