11#ifndef THREAD_POOL_H
22#define THREAD_POOL_H
33
4- #include < function2/function2.hpp >
4+ #include < functional >
55#include < future>
66#include < queue>
77
@@ -16,7 +16,7 @@ class ThreadPool {
1616 // need to keep track of threads so we can join them
1717 std::vector< std::thread > workers;
1818 // the task queue
19- std::queue< fu2::unique_function <void ()> > tasks;
19+ std::queue< std::packaged_task <void ()> > tasks;
2020
2121 // synchronization
2222 std::mutex queue_mutex;
@@ -34,7 +34,7 @@ inline ThreadPool::ThreadPool(size_t threads)
3434 {
3535 for (;;)
3636 {
37- fu2::unique_function <void ()> task;
37+ std::packaged_task <void ()> task;
3838
3939 {
4040 std::unique_lock<std::mutex> lock (this ->queue_mutex );
@@ -59,19 +59,19 @@ auto ThreadPool::enqueue(F&& f, Args&&... args)
5959{
6060 using return_type = std::invoke_result_t <F, Args...>;
6161
62- auto task = std::make_unique< std:: packaged_task<return_type ()> > (
62+ std::packaged_task<return_type ()> task (
6363 std::bind (std::forward<F>(f), std::forward<Args>(args)...)
6464 );
6565
66- std::future<return_type> res = task-> get_future ();
66+ std::future<return_type> res = task. get_future ();
6767 {
6868 std::unique_lock<std::mutex> lock (queue_mutex);
6969
7070 // don't allow enqueueing after stopping the pool
7171 if (stop)
7272 throw std::runtime_error (" enqueue on stopped ThreadPool" );
7373
74- tasks.emplace ([task = std::move (task)]() { (*task)(); } );
74+ tasks.emplace (std::move (task));
7575 }
7676 condition.notify_one ();
7777 return res;
0 commit comments