ASIO的post和dispatch方法

简介: ASIO的post和dispatch方法的实现和差别

ASIO的post和dispatch方法

关于这两个方法,我去网上找了一大堆资料,都没有讲清楚是怎么一回事。还是读了ASIO的源代码这才理解。

要提到这两个方法,不得不提一下Windows的两个API:SendMessagePostMessage

io_context::postPostMessage的行为差不多,投递完消息立即返回,Handler的执行跟它没有半毛钱的关系。

io_context::dispatch可以认为是SendMessage的超集,SendMessage是阻塞的,必须要在消息处理完成之后才返回,当io_context::dispatchio_context的工作线程中被调用的时候,io_context::dispatch的行为和SendMessage是一致的,必须要在Handler调用完成之后才返回。但是,如果不是io_context的工作线程中调用,则执行了io_context::post一样的行为:将Handler投递到io_context的事件队列中去。

我下面用伪代码来描述其功能:

void post(Handler handler)
{
    _queue.push(handler);
}

void dispatch(Handler handler)
{
    if (can_execute())
        handler();
    else
        post(handler);
}

void run()
{
    _work_thrd_id = std::this_thread::get_id();
    while (!_queue.empty())
    {
        auto handler = _queue.front();
        _queue.pop();
        handler();
    }
}

bool can_execute()
{
    return _work_thrd_id == std::this_thread::get_id();
}
目录
相关文章
|
前端开发 API
patch使用
+ put:对所有资源进行更新 + patch:对部分资源进行更新 put使用方法和post相同,但是put是幂等的。
|
前端开发 Java 开发者
Dispatch 设计| 学习笔记
快速学习 Dispatch 设计。
134 0
Dispatch 设计| 学习笔记
|
开发工具 git
生成patch
生成patch
|
监控
Dispatch Source 应用
Dispatch Source 源是一个偏底层的函数集合,使用时CPU负荷非常小,尽量不占资源,开发过程中大多是配合定时器使用。
195 0
GCD全解-dispatch_after/dispatch_time-t延迟操作
GCD全解-dispatch_after/dispatch_time-t延迟操作
340 0
|
设计模式 开发框架 前端开发
SpringMVC源码解析DispatcherServlet#doDispatch方法流程(上)
SpringMVC源码解析DispatcherServlet#doDispatch方法流程(上)
257 0
SpringMVC源码解析DispatcherServlet#doDispatch方法流程(上)
SpringMVC源码解析DispatcherServlet#doDispatch方法流程(下)
SpringMVC源码解析DispatcherServlet#doDispatch方法流程(下)
307 0
SpringMVC源码解析DispatcherServlet#doDispatch方法流程(下)
|
前端开发 Java 开发者
Dispatch设计|学习笔记
快速学习Dispatch设计
Dispatch设计|学习笔记
|
JavaScript
说说 element 组件库 broadcast 与 dispatch
说说 element 组件库 broadcast 与 dispatch
274 0
|
前端开发
获取this.$store.dispatch的返回值
获取this.$store.dispatch的返回值
1099 0