开发者社区> 杨粼波> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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();
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 22丨页面推荐【难度中等】​
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 22丨页面推荐【难度中等】​
27 0
什么是NoSQL?
什么是NoSQL? NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。
5450 0
Section %post does not end with %end
Section %post does not end with %endException AttributeError: "NoneType" object no attribute 'udev_unref' in
1304 0
SwitchButton 开关按钮 的多种实现方式
刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。 起初我在android上我只会使用CheckBox去满足对应的功能。
1014 0
+关注
杨粼波
网游的老兵
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载