异步是性能优化非常重要的手段,下面如下场合可以使用异步:

  ● 服务器程序要求很高的实时性,几乎逻辑层不执行io操作,io操作通过任务队列被io线程执行成功后再通过回调的方式传回逻辑层。

  ● 网游中用户登录,需呀从数据库载入用户数据,数据库层不需要知晓逻辑层如何处理用户数据,当接口被调用时必须传入回调函数,数据库层载入数据后直接调用回调函数,而数据作为参数。

  隐式任务队列

  使用任务队列可以解耦多线程的设计。更加的使用是将其封装在接口之后。前边的例子中都是显示的操作了任务队列对象。但这限制了用户必须知道某个接口需要绑定哪个任务队列上,尤其是多线程多任务队列的例子,如果当用户操作socket接口时还要知道socket对应哪个任务队列显得不够优雅了。Socket自己本身可以保存对应任务队列的引用,这样使用者只需调用socket的接口,而接口内部再将请求投递到争取的任务队列。示例代码:

void socket_impl_t::async_send(const string& msg_)
{
    tq.produce(task_binder_t::gen(&socket_impl_t::send, &this, msg_));
}
void socket_impl_t::send(const string& msg_)
{
    //do send code
}

  总结:

  ● 设计多线程程序时,往往设计使用任务队列是关键,好用、高效、灵活的任务队列组件十分必需,本节介绍的实现支持多种多线程模式,易用易理解。

  ● 异步回调在多线程程序中非常常见,异步往往是为了提高性能和系统吞吐量的,但是异步其不可避免的会带来复杂性,所以尽量保证异步相关的步骤简单。

  ● 任务队列封装对象接口的内部更佳,使用者直接调用接口,仿佛没有任务队列这回事,让他在看不见的地方默默运行。

  ● 本节设计的任务队列是线程安全的,并且关闭时已经投递的任务能够保证被。