将packaged_task对象移动到lambda捕获时出错

时间:2016-04-30 18:57:05

标签: c++ lambda concurrency

我正在实现一个在可调用对象上有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"; } );

编译器通过emplace_back抱怨error: no match for call to '(const std::packaged_task<void()>) ()' _work_queue.emplace_back([task=::std::move(task)]() { task(); });我不明白出了什么问题,因为据我所知packaged_task只是可移动的,我正在通过移动捕获任务。

0 个答案:

没有答案