【问题标题】:What is the difference between post and dispatch in boost::asio?boost::asio 中的 post 和 dispatch 有什么区别?
【发布时间】:2018-11-27 09:45:05
【问题描述】:

我正在尝试使用boost:asio 库来创建线程池。官方文档说:

dispatch : 请求 io_service 调用给定的处理程序。

post:请求 io_service 调用给定的处理程序并立即返回。

有人能解释一下这两者有何不同吗?

【问题讨论】:

    标签: c++ multithreading boost-asio threadpool asio


    【解决方案1】:

    Post 确保调用 post 的线程不会立即尝试处理任务。

    https://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/io_service/post.html

    但不允许 io_service 从内部调用处理程序 这个函数。

    Dispatch 没有做出这样的承诺;并且可能在函数返回时完成。

    【讨论】:

    • 可能或保证?
    • @ChristopherPisz 可能。它只承诺它将在一个名为 run(), run_one(), poll() or poll_one() 的线程上运行
    • @ChristopherPisz 如果dispatch()将作业发送到一个链(或任何其他单执行对象),那已经很忙(即运行其他一些完成处理程序),那么dispatch() 将表现得像post() 并标记该作业以供以后执行。
    【解决方案2】:

    不同之处在于dispatch 可以在其中运行handler(传递给它的CompletionHandler),这意味着您将在函数返回之前等待它完成(如果完成)。另一方面,post 本身不会运行 handler 并立即返回调用站点。

    因此,dispatch 是一个潜在的阻塞调用,而 post 是一个非阻塞调用。

    【讨论】:

    • 什么决定了“潜在”方面是否实现?
    • @ChristopherPisz 如果dispatch 可以授予处理程序将仅在run()run_one()poll()poll_one() 成员函数为当前正在调用,那么它可能会使其成为阻塞调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2016-11-14
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多