创建任务然后功能(如std :: future.then)

时间:2014-08-16 12:20:48

标签: c++ c++11

由于我们可能需要等待一段时间才能实现std::future::then我正在尝试编写一个非常简单的任务包装器,问题是调用回调函数。让我们说我们有一个类:

template<typename... ARG>
class Task
{
public:
    typedef std::function<void(ARG...)> task_func_t;

    Task() {}

    void then(task_func_t callback) { this->callback_ = callback; }

    void finish(ARG... arguments)
    {
        this->callback_(std::forward<ARG>(arguments)...);
    }

    void operator()(ARG... arguments)
    {
        this->callback_(std::forward<ARG>(arguments)...);
    }

private:
     task_func_t callback_;
};

并假设以下用法:

std::shared_ptr<Task<int>> sum(int n1, int n2)
{
    auto ptr = std::make_shared<Task<int>>();
    myPool.process([n1, n2, ptr]
    {
        (*ptr.get())(n1 + n2);
    }
    return ptr;
}

void test()
{
    sum(5, 6)->then([](int sum) { std::cout << "Sum is " << sum << std::endl };
}

我有时遇到在实际设置函数之前调用回调的问题。我知道只要回调无效我就可以查看,但我不是非常喜欢这个解决方案,那么还有其他智能解决方案吗?我实际上想过这样做:

return task.before(do prepare work);

.then(process result)

那么那么当链接完成时它会调用创建线程。完美的解决方案是在需要之前调用then的东西,但我认为只要我想要这个设计它就不可能。

2 个答案:

答案 0 :(得分:1)

您可以等待条件变量。使其成为任务类的成员,并在设置功能后发出信号。

答案 1 :(得分:1)

对于未来,你可能会做类似的事情:
implementing-futurethen-equivalent-for-asynchronous-execution-in-c11then实施

template <typename Fut, typename Work>
auto then(Fut f, Work w) -> std::shared_future<decltype(w(f.get()))>
{
    return std::async([=]{ w(f.get()); });
}

std::shared_future<int> sum(int a, int b)
{
    return std::async([](int a, int b) { return a + b; }, a, b);
}

int main() {
    then(sum(40, 2), [](int n) {std::cout << "Sum is " << n << std::endl;}).wait();
    return 0;
}

Live example