查看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)();
使用该行,服务器对象是从当前对象构造的副本。
但是没有发生以下情况的可能性:
operator()()
方法如果安全,为什么?
答案 0 :(得分:1)
父级不会破坏子对象。
这是因为协程对象是要调用的实际完成处理程序,副本将保留在服务的队列中。
因为这些字段是(通常)共享指针,所以实际数据从副本“轻轻地”传播到复制,仅在最后一个完成处理程序完成时被破坏,并且协同程序退出,而不是产生
让所有字段成为共享指针的替代方法可能是使协同程序派生enable_shared_from_this
,就像许多其他Asio示例所示。我没有真正使用它与协同程序,但我认为它有价值(减少引用计数的收益的开销),并不能立即想到它不适用于协同程序的原因。