Boost.asio和异步链,unique_ptr?

时间:2016-05-09 06:39:11

标签: c++ asynchronous boost boost-asio asyncsocket

我对异步编程并不熟悉,我有一个问题。

我的问题如下。给出了boost.server中的C ++ 11的echo_server示例:http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp

我想知道在{+ 1}}中是否可以用C ++ 14中的std::make_shared<session>替换C ++ 14,从而避免了引用计数的开销。

我不确定,因为我们有std::unique_ptr<session>但不是shared_from_this(),所以如何从unique_from_this()内部访问unique_ptr<session>

2 个答案:

答案 0 :(得分:2)

不,在asio编程中使用shared_ptr是惯用的。

我们的想法是,未完成处理程序的数量与启动异步操作的对象的共享计数相匹配。这是通过将管理对象的shared_ptr的副本绑定到处理函数对象中来实现的。

c ++ 11/14方式是将boost::shared_ptr替换为std::shared_ptrstd::bind,lambdas等也与asio完美配合。)

更新,现在我完全理解了这个问题:

在您链接的示例中,我认为您指的是在方法go()中创建的名为self的shared_ptr?如果你愿意,你可以在没有shared_ptr的情况下编写它。你必须删除这个作为go()的最后一行。您还必须记住捕获任何异常以确保采用此代码路径。当然可以设置unique_ptr来执行此操作,但是在构建会话和成功创建采用unique_ptr之间存在生命周期管理问题。 shared_ptr减轻了一个原子公司成本的管理负担......

在这种情况下,答案是严格的“是”,但我会建议,因为它更脆弱。

答案 1 :(得分:0)

  

据我了解,您的会话对象将通过一个处理程序管道,一次一个。永远不会共享您的会话状态。为什么unique_ptr没有意义?关键是当最新的处理程序完成后,内存将被释放。这是否成立?

是的,这就是诀窍。该库是围绕可复制的完成处理程序设计的。

如果您担心开销,请务必避免使用shared_ptr。

在这种情况下,只需对具有外部控制寿命的某个状态进行引用。只要确保它保持活着(就像你对io_service对象本身一样)。