用C++11的线程库完成异步调用非常方便,标准库提供了非常漂亮的接口。下面就是个很好的例子.
template<typename>
struct async_call;
template<typename R, typename... Args>
struct async_call<R(Args...)>
{
template<typename F>
async_call(F&& f, Args... args)
{
std::packaged_task<R(Args...)> task(f);
m_future=task.get_future();
std::thread(std::move(task), args...).detach();
}
R get()
{
return m_future.get();
}
private:
std::future<R> m_future;
};
这个模版类简单地包装了一下标准库,这样调用:
int a=10, b=20;
//需要异步执行的代码和参数
async_call<int(int)> ac([](int x){ return x*x; }, a);
//串行执行的代码
b*=b;
//合并计算结果,并输出
cout<<ac.get()+b<<endl;
这样基本不用关心线程编程的细节,编程感受也和脚本类似了,哈哈。