如何在fork上克隆Boost ASIO协同程序?

时间:2014-06-12 21:48:46

标签: boost boost-asio coroutine

查看Boost ASIO http服务器example with coroutines我想知道使用的克隆方法是否安全:

    // We "fork" by cloning a new server coroutine to handle the connection.
    // After forking we have a parent coroutine and a child coroutine. Both
    // parent and child continue execution at the following line. They can
    // be distinguished using the functions coroutine::is_parent() and
    // coroutine::is_child().
    fork server(*this)();

使用该行,服务器对象是从当前对象构造的副本。

但是没有发生以下情况的可能性:

  1. 克隆的儿童协程发出收益
  2. 因此,孩子的协同身体被留下了
  3. 因此,保留了孩子的operator()()方法
  4. 父解析子对象
  5. 父级开始新的迭代并产生
  6. 由孩子调用的异步方法完成
  7. 因此,现在(被破坏的)儿童协程被重新进入
  8. 如果安全,为什么?

1 个答案:

答案 0 :(得分:1)

父级不会破坏子对象。

这是因为协程对象要调用的实际完成处理程序,副本将保留在服务的队列中。

因为这些字段是(通常)共享指针,所以实际数据从副本“轻轻地”传播到复制,仅在最后一个完成处理程序完成时被破坏,并且协同程序退出,而不是产生


让所有字段成为共享指针的替代方法可能是使协同程序派生enable_shared_from_this,就像许多其他Asio示例所示。我没有真正使用它与协同程序,但我认为它有价值(减少引用计数的收益的开销),并不能立即想到它不适用于协同程序的原因。