创建共享的packaged_task,它接受带转发的参数

时间:2015-09-15 16:42:51

标签: c++ multithreading c++11 lambda std

您好我不知道如何编写正确的绑定队列并执行传递给方法的lambda表达式OCRQueue :: enqueue()

// the task queue
std::queue< std::function<void(OCRK*)> > tasks;

// add new work item to the pool
template<class F>
auto OCRQueue::enqueue(F&& f)
-> std::future<typename std::result_of<F(OCRK*)>::type>
{
    using return_type = typename std::result_of<F(OCRK*)>::type;

    auto task = std::make_shared< std::packaged_task<return_type()> >
    (
        // how to initialize this task so that it can be called 
        // task(OCRK*) passing the parameter to f(OCRK*)
        std::bind
        (
            std::forward<F>(f)
        )
    );

    std::future<return_type> res = task->get_future();
    {
        std::unique_lock<std::mutex> lock(queue_mutex);

        // don't allow enqueueing after stopping the pool
        if (stop)
            throw std::runtime_error("enqueue on stopped thread_pool");

        // this fails because task does not accept parameters
        tasks.emplace([task](OCRK* ocr){ task(ocr); });
    }
    condition.notify_one();
    return res;
}

目前无法编译&#34; auto task =&#34;因为f需要一个OCRK *类型的参数:

错误6错误C2064:term不计算为采用0参数的函数C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ xrefwrap 58 1 Skilja.PR.API

开:1&gt; d:\ sourcecode \ skilja \ alpr \ alpr \ skilja.pr.api.native \ OCRQueue.h(51):参见函数模板实例化&#st; :: shared_ptr&gt; std :: make_shared,std :: _ Bind&amp;,&gt;&gt;(std :: _ Bind&amp;,&gt;&amp;&amp;)&#39;正在编制

预期用法如下:

OCRQueue ocrPool(std::thread::hardware_concurrency());
auto work = [](OCRK* ocr)
{
    return ocr->DoSomething();
};
future<DoSomethingResult> result = ocrPool.enqueue(work);

OCRK *将在出列并在另一个线程中执行时传递给入队函数。

1 个答案:

答案 0 :(得分:2)

要创建一个接受单个参数的可调用对象,您需要告诉bind使用占位符作为参数:

std::bind( std::forward<F>(f), std::placeholders::_1 )

这告诉bind留下一个未绑定的参数,在调用函数对象时必须提供该参数。

但是我不明白你为什么要使用bind,你没有绑定任何东西,f已经是一个可以接受单个参数的可调用对象,为什么要&? #39;你只是把它传递给packaged_task构造函数?

还有一个问题,就是你说你想要一个接受单个参数的任务,但你已经声明packaged_task<return_type()>这是一个不带参数的任务。我想你想要:

auto task = std::make_shared< std::packaged_task<return_type(OCRK*)> >(std::forward<F>(f));

此外:

    tasks.emplace([task](OCRK* ocr){ task(ocr); });

仍然会失败,因为taskshared_ptr,所以它不可调用。它应该是:

    tasks.emplace([task](OCRK* ocr){ (*task)(ocr); });