shared_ptr真实生活用例

cod*_*ode 12 c++ shared-ptr c++11

当我们有一个希望拥有动态分配项的多个所有者的场景时,将使用shared_ptr.

问题是,我无法想象我们需要多个所有者的任何情况.我可以使用unique_ptr解决我可以成像的每个用例.

有人可以提供一个真实的用例示例,其中代码需要shared_ptr(并且根据需要,我的意思是作为智能指针的最佳选择)?而对于"现实生活",我指的是一些实用和务实的用例,而不是过于抽象和虚构的东西.

Dan*_*ler 9

在我们的模拟器产品中,我们使用框架在模拟组件(称为端点)之间传递消息。这些端点可以驻留在进程中的多个线程上,甚至可以驻留在模拟群集中的多台计算机上,这些消息中的消息是通过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);
};
Run Code Online (Sandbox Code Playgroud)

通常,一旦执行了发送方端点send,就无需等待任何接收方的任何响应。所以,如果我们要尽量保持整个消息路由过程船东单,那就没有意义保留所有权的调用者send或以其他方式,send 必须等待,直到所有接收器处理完消息,这将引入不必要的往返延迟。另一方面,如果有多个接收者订阅了topic,因此将唯一所有权分配给其中任何一个也没有意义,因为我们不知道其中哪个需要最长的消息。这将使路由基础结构本身成为唯一所有者。但是,在那种情况下,路由基础设施将不得不等待所有接收者完成,而基础设施可能有许多消息要传递到多个线程,并且它还希望能够将消息传递给接收者和接收者。能够转到要传递的下一条消息。另一种选择是保留一组唯一的指向发送消息的指针,以等待线程对其进行处理,并让接收者在完成消息后通知消息路由器。但这也会带来不必要的开销。

另一方面,通过使用shared_ptr此处,一旦路由基础结构完成了将消息传递到端点的传入队列的操作,便可以释放所有权以在各个接收方之间共享。然后,线程安全的引用计数确保Message所有接收器完成处理后将其释放。而且在远程计算机上有订阅者的情况下,序列化和传输组件可以在消息工作时成为消息的另一个共享所有者。然后,在接收机器上,接收和反序列化组件可以Message将其创建的副本的所有权转给该机器上的接收者的共享所有权。

  • 生命被赋予在一个地方,但那个地方对那个对象没有用,它的目的只是给对象赋予生命,然后将它传递给函数,这些函数将以异步方式独立地实际使用它,与彼此。我会让其他人插话,但我认为这是一个很好的例子。 (3认同)