我一直在阅读提升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
将如何知道应该为这个事件调用完成处理程序,并为该事件调用哪一个(我考虑过调查实现,但对我来说现在看起来有点沉重。)
答案 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
可以实现非阻塞线程安全性。