ASIO的post和dispatch方法

474 阅读1分钟

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