c#和java中都有直接提供方法实现异步执行一个任务,并在其执行完成后执行指定的任务。然而c++11却没有直接提供类似的实现。虽然用c++98的泛型和直接使用系统线程也能实现,不过要实现好还是很复杂。现在有了c++11,就可以用其中的 std::async 和 lambda方便地实现了。
在前面的任务执行完成后,可能会返回一个值,也可能不会返回值,后续的任务虽然大部分情况都需要使用到返回的值但也可以选择性忽略返回值。因此提供了两个函数,一个将当前返回值传给下一个函数,另一个忽略返回值。
实现:
#ifndef __ASYNC_TASK
#define __ASYNC_TASK
#include <functional>
#include <future>
#include <utility>
template <typename T>
class Task;
template <typename R, typename... Args>
class Task < R(Args...) >
{
public:
using return_type = R;
template <typename F, typename... exArgs>
auto then(F&& f, exArgs&&... args) -> Task < typename std::result_of<F(exArgs...)>::type(void) >
{
using thRType = typename std::result_of<F(exArgs...)>::type;
auto func = std::move(m_fn);
auto thFn = std::bind(std::forward<F>(f), std::forward<exArgs>(args)...);
return Tas
C++11利用std::async实现异步链式调用

本文介绍了如何在C++11中利用std::async和lambda表达式来实现异步任务的链式调用。尽管C#和Java提供了直接的异步方法支持,但C++11通过std::async提供了更灵活的解决方案。通过示例,文章展示了如何处理有返回值和无返回值的情况,以满足不同场景的需求。
最低0.47元/天 解锁文章
168





