2017-07-24 72 views
0

我一直在阅读boost asio文档,具体是关于Proactor设计。io_service如何将完成事件与完成处理程序相匹配

,当我遇到这丝毫不差

前摄设计模式来:并发无绪

我有点不解的是,ASIO的用户并不需要做的创建额外的线程异步IO作为线程已经以这种模式中的异步操作处理器的形式占上风。

所以只是为了确认io_service对象是要作为一个前摄(获取完成事件,并分派到完成处理)

每当一个异步过程得到启动它会通过一个后台线程来照顾。

socket.async_connect(server_endpoint, your_completion_handler);

是下述顺序是否正确?

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

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

3)async_connect完成后,结果/ Errorcode将被放置在完成事件队列中。

4)前摄(io_service对象?)获取完成事件将其映射到处理器

我只是想知道这是如何映射已经完成,由于异步操作处理器已经做出来的线程(没有它?)任何先完成的事情都会触发一个完成事件,以及如何知道应该为这个事件调用哪个完成处理程序,以及该事件的哪一个完成处理程序(我认为要研究实现中的哪一个),但对我而言,现在看起来有点沉重)

回答

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可以实现非阻塞线程安全。

+0

我同意'strand',它使得完成事件队列实际上使线程安全,当我们有多个proactors来监视一个完成事件。TBH'ASIO推送给io_service的函数包含你的处理程序'我有同样的想法,根据已经说过的,我们只有一个队列,它实际上是一个任务队列,一旦线程弹出执行它的任务并将其称为这是另一个参数。是对的吗? –

+0

@Explorer_N是的,一旦任务完成,相关的处理程序将被调用,这是一个参数。我重复了你所说的,因为我想强调处理程序在任务完成后调用。 –

+0

你知道这只是一个想法,难道这似乎与这里的图表有所不同:http://www.boost.org/doc/libs/1_64_0/doc/html/booster_asio/overview/core/async。如果你看看他们,他们已经展示了一个名为'Completion Event Queue'的单独队列,在这里,处理器将监视一个事件并在将结果转换为适当的错误代码后将其分派给处理程序,所以对我来说就像异步操作和处理程序已分离,并通过合适的派遣由一个proactor合并。 –

相关问题