std :: boost :: asio :: post / disp使用哪个io_context?

时间:2018-09-22 16:27:44

标签: c++ asynchronous boost boost-asio

在使用boost :: asio 1.66时,我在文档中看到boost::asio::io_context::post不推荐使用boost::asio::post,而boost::asio::io_context::dispatch则不推荐使用。因为在它们之前io_context的成员函数之前,并且当然需要在某些io_context的上下文中执行处理程序,即executor,所以我的问题是:

boost :: asio :: io_context :: post最简单的重载如何知道要使用哪个io_contextexecutor

template< typename CompletionToken> DEDUCED post(CompletionToken && token);的文档中指出

  

通过执行get_associated_executor(handler)获得处理程序的关联执行程序对象ex。

但是get_associated_executor的文档也不清楚。我的猜测是由于 Template参数扣除,它可以以某种方式在当前执行的处理程序中获取它,但是我想确保,而且,如果我在外部调用post,这还不够boost :: asio处理程序。

1 个答案:

答案 0 :(得分:1)

文档的核心可以找到associated_executor trait

  
      
  • get()

         

    如果T具有嵌套类型executor_type,则返回t.get_executor()。否则返回ex。

  •   
  • executor_type

         

    如果T具有嵌套类型executor_type,则为T :: executor_type。否则为执行人。

  •   

如果处理程序类型¹具有嵌套的executor_type类型,则假定调用token.get()将返回要使用的正确执行程序。

如果传递可传递消息的普通调用而不指定执行者/执行上下文,您将获得执行上下文的默认构造实例:boost::asio::system_executor

此操作的目的是使用自定义处理程序类型来实现DoTheRightThing。例如。如果在链上发布内容,则处理程序将被包装为特定于链实现的类型。 associated_executor特征和同上的get_executor()成员函数将进行协调,以直接指向该链的执行者。


¹或任何令牌,以防您的调用模型不同(例如收益上下文)