【发布时间】:2018-11-27 09:45:05
【问题描述】:
我正在尝试使用boost:asio 库来创建线程池。官方文档说:
dispatch : 请求 io_service 调用给定的处理程序。
post:请求 io_service 调用给定的处理程序并立即返回。
有人能解释一下这两者有何不同吗?
【问题讨论】:
标签: c++ multithreading boost-asio threadpool asio
我正在尝试使用boost:asio 库来创建线程池。官方文档说:
dispatch : 请求 io_service 调用给定的处理程序。
post:请求 io_service 调用给定的处理程序并立即返回。
有人能解释一下这两者有何不同吗?
【问题讨论】:
标签: c++ multithreading boost-asio threadpool asio
Post 确保调用 post 的线程不会立即尝试处理任务。
https://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/io_service/post.html
但不允许 io_service 从内部调用处理程序 这个函数。
Dispatch 没有做出这样的承诺;并且可能在函数返回时完成。
【讨论】:
run(), run_one(), poll() or poll_one() 的线程上运行
dispatch()将作业发送到一个链(或任何其他单执行对象),那已经很忙(即运行其他一些完成处理程序),那么dispatch() 将表现得像post() 并标记该作业以供以后执行。
不同之处在于dispatch 可以在其中运行handler(传递给它的CompletionHandler),这意味着您将在函数返回之前等待它完成(如果完成)。另一方面,post 本身不会运行 handler 并立即返回调用站点。
因此,dispatch 是一个潜在的阻塞调用,而 post 是一个非阻塞调用。
【讨论】:
dispatch 可以授予处理程序将仅在run()、run_one()、poll() 或poll_one() 成员函数为当前正在调用,那么它可能会使其成为阻塞调用。