c++ - shared_ptr 现实生活中的用例

标签 c++ c++11 shared-ptr

shared_ptr 将在我们希望拥有一个动态分配项目的多个所有者的情况下使用。

问题是,我无法想象我们需要多个所有者的任何场景。我能想到的每个用例都可以用 unique_ptr 解决。

有人可以提供一个现实生活中的用例示例,其中包含需要 shared_ptr 的代码(这里需要,我的意思是作为智能指针的最佳选择)?我所说的“现实生活”是指一些实用的用例,而不是过于抽象和虚构的东西。

最佳答案

在我们的模拟器产品中,我们使用一个框架在模拟组件(称为端点)之间传递消息。这些端点可以驻留在进程内的多个线程上,甚至可以驻留在模拟集群中的多台机器上,消息通过 RDMA 或 TCP 连接的网格进行路由。 API 大致如下所示:

class Endpoint {
public:
    // Fill in sender address, etc., in msg, then send it to all
    // subscribers on topic.
    void send(std::unique_ptr<Message> msg, TopicId topic);

    // Register this endpoint as a subscriber to topic, with handler
    // called on receiving messages on that topic.
    void subscribe(TopicId topic,
        std::function<void(std::shared_ptr<const Message>)> handler);
};

一般来说,一旦发送方端点执行了send,它就不需要等待任何接收方的任何响应。因此,如果我们试图在整个消息路由过程中保留一个所有者,那么将所有权保留在 send 的调用者中是没有意义的,否则 send < em>将必须等到所有接收者都处理完消息,这会引入不必要的往返延迟。另一方面,如果多个接收者订阅了 topic,那么将唯一的所有权分配给其中的任何一个也没有意义,因为我们不知道他们中的哪一个需要消息最长。这将使路由基础设施本身成为唯一的所有者;但同样,在那种情况下,路由基础设施将不得不等待所有接收者完成,而基础设施可能有大量消息要传递给多个线程,并且它还希望能够将消息传递给接收者和能够转到下一条要传递的消息。另一种选择是保留一组指向发送的消息的唯一指针,等待线程处理它们,并让接收者在完成时通知消息路由器;但这也会引入不必要的开销。

另一方面,通过在此处使用 shared_ptr,一旦路由基础结构完成向端点的传入队列传递消息,它就可以释放所有权以在各种接收者之间共享。然后,线程安全的引用计数确保在所有接收者完成处理后释放 Message。在远程机器上有订阅者的情况下,序列化和传输组件在执行其工作时可能是消息的另一个共享所有者;然后,在接收机器上,接收和反序列化组件可以将它创建的 Message 拷贝的所有权传递给该机器上接收者的共享所有权。

关于c++ - shared_ptr 现实生活中的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834271/

相关文章:

c++ - 输出不正确

c++ - 库设计困惑.. "public"/"private"(template) headers, library files..?

c++ - 使用 std::shared_ptr 在生产者/消费者线程之间共享数据

c++ - Shared_ptr<X> 的原始数组,其中 X 似乎没有初始化?

c++ - 如何通过共享 ptr 访问类的成员函数到共享 ptr?

c++ - 释放资源的异常处理的替代方案

C++ 虚函数意外行为

c++ - 这个算法解决数独的时间复杂度是多少?

c++ - 为什么在有私有(private)变量的情况下需要使引用常量?

c++ - 反复调用 std::future::get