io_service如何将完成事件与完成处理程序

时间:2017-07-24 10:56:24

标签: c++ boost-asio

我一直在阅读提升asio文档,特别是关于Proactor设计。

当我遇到这个小小的时候

Proactor设计模式:无线程并发

我有点理解的是,asio的用户不需要为执行异步IO创建额外的线程,因为在此模式中,线程已经以异步操作处理器的形式占优势。

所以只是为了确认io_service将作为一个proactor(获取完成事件并将其发送到完成处理程序)

每当异步进程启动时,它都将由后台线程负责。

socket.async_connect(server_endpoint, your_completion_handler);

以下序列是否正确?

1)连接操作将由线程处理。

2)Completion_handler将被推入某个队列(或任何DS)?。

3)async_connect完成后,它的结果/错误代码将被置于完成事件队列中。

4)proactor(io_service?)获取完成事件将其映射到处理程序

我只是想知道这个映射是如何完成的,因为异步操作处理器已经完成了线程(不是吗?)任何先完成的事情都会触发一个完成事件以及io_service将如何知道应该为这个事件调用完成处理程序,并为该事件调用哪一个(我考虑过调查实现,但对我来说现在看起来有点沉重。)

1 个答案:

答案 0 :(得分:1)

io_service基本上是一个函数队列。当您实例化socket时,会将io_service的引用传递给它。现在,当你打电话时:

socket.async_connect(server_endpoint, your_completion_handler);

您正在启动异步操作,其中ASIO将同步函数推送到io_service,这是您的函数队列。 ASIO推送到io_service的功能包含您的处理程序。到时候,io_service从队列中弹出一个元素(一个函数)并为你做操作,最后用该操作的结果调用你的处理程序。

关于排队的更多信息:如果你在一个线程中启动io_service对象(带有io_service::run()),那么你将拥有一个真正的串行队列,按顺序执行所有操作。另一方面,如果在多个线程上调用io_service::run(),则队列将在这些线程上分发。使用ASIO strand可以实现非阻塞线程安全性。