两次调用io_service::run方法有什么影响
What is the impact of calling io_service::run method twice
以下架构来自 boost asio 文档:
我知道如果我调用 io_service::run
方法两次(在两个单独的线程中),我将有两个线程通过异步事件多路分解器从完成事件队列中取出事件,对吗?
更准确地说,我的疑问是通过多次调用io_service::run
方法实现的并行化。例如在处理套接字时,如果我有两个套接字绑定在同一个 io_service object
上,每个套接字调用 socket.async_read_some
方法,它是否涉及 2 个注册的回调(通过 async_read_some 方法)调用io_service::run
两次可以同时调用
你的假设是正确的。每个调用 io_service::run()
的线程将并行出列和执行处理程序(简单函数对象)。这当然只有在您有多个事件源为 io_service 提供数据时才有意义(例如两个套接字、一个套接字和一个计时器、多个同时的 post()
调用等)。
每次调用套接字的 async_read()
都会导致恰好有一个处理程序在 io_service 中排队。只有您的线程之一会将其出列并执行。
注意不要一次多次调用 async_read() 每个套接字。
以下架构来自 boost asio 文档:
我知道如果我调用 io_service::run
方法两次(在两个单独的线程中),我将有两个线程通过异步事件多路分解器从完成事件队列中取出事件,对吗?
更准确地说,我的疑问是通过多次调用io_service::run
方法实现的并行化。例如在处理套接字时,如果我有两个套接字绑定在同一个 io_service object
上,每个套接字调用 socket.async_read_some
方法,它是否涉及 2 个注册的回调(通过 async_read_some 方法)调用io_service::run
两次可以同时调用
你的假设是正确的。每个调用 io_service::run()
的线程将并行出列和执行处理程序(简单函数对象)。这当然只有在您有多个事件源为 io_service 提供数据时才有意义(例如两个套接字、一个套接字和一个计时器、多个同时的 post()
调用等)。
每次调用套接字的 async_read()
都会导致恰好有一个处理程序在 io_service 中排队。只有您的线程之一会将其出列并执行。
注意不要一次多次调用 async_read() 每个套接字。