【发布时间】:2016-08-25 19:55:46
【问题描述】:
我正在实现一个线程池,它在可调用对象上有一个push_back 方法。但是,我在使用 lambda 技巧将打包任务移动到函数对象时遇到错误。
class Threadpool {
public:
// ...
::std::deque <::std::function<void()>> _work_queue;
::std::mutex _work_queue_mutex;
::std::condition_variable _worker_signal;
template <typename CallableT>
::std::future<::std::result_of_t<CallableT()>> push_back(CallableT&&);
}
template<typename CallableT>
::std::future<::std::result_of_t<CallableT()>> Threadpool::push_back(CallableT&& callable) {
::std::packaged_task<::std::result_of_t<CallableT()>()> task (::std::move(callable));
auto fu = task.get_future();
{
::std::unique_lock<::std::mutex> locker(_work_queue_mutex);
// COMPILE ERROR
_work_queue.emplace_back([task=::std::move(task)] () { task(); })
}
_worker_signal.notify_one();
return fu;
}
Threadpool pool;
pool.emplace_back( []() { ::std::cout << "hello\n"; } );
编译器通过error: no match for call to '(const std::packaged_task<void()>) ()' _work_queue.emplace_back([task=::std::move(task)]() { task(); }); 抱怨emplace_back 我不明白出了什么问题,因为据我所知packaged_task 只能移动,我正在通过移动捕获任务。
【问题讨论】:
-
您可以尝试将 lambda 转换为
std::function<void>吗?
标签: c++ lambda concurrency c++14