这是shared_ptr的适当用途吗

Is this an appropriate use for shared_ptr?

本文关键字:shared ptr 这是      更新时间:2023-10-16

项目:典型的聊天程序。服务器必须接收来自多个客户端的文本,并将每个输入扇出到所有客户端。

在服务器中,我希望每个客户端都有一个包含套接字fd和std::队列的结构。每个结构都将在std::列表中。

当从客户端套接字接收输入时,我想迭代结构列表,并将新输入放入每个客户端结构的队列中。字符串是新的,因为我不希望字符串的副本在所有客户端上相乘。但我也想避免让多个指向字符串的指针分散开来,并决定何时最终删除该字符串的麻烦。

这是共享指针的合适时机吗?如果是,那么shared_ptr是否在每次将它们推入队列时递增,而在从队列中弹出时递减?

谢谢你的帮助。

在这种情况下,伪垃圾收集器系统的工作性能将比引用计数好得多。

您只需要一个字符串列表,因为您"将每个输入扇出到所有客户端"。因为您将添加到一端并从另一端删除,所以deque是一个合适的数据结构。

现在,每个连接只需要跟踪它发送的最后一个字符串的索引。每隔一段时间(每收到1000条消息,或每收到4MB消息,或诸如此类),您就会在所有客户端中找到该索引的最小值,并删除到此为止的字符串。这种定期检查也是一个机会,可以检测远远落后的客户端(可能断开连接)并进行恢复。如果不进行此检查,单个卡住的客户端将导致程序内存泄漏(即使在引用计数方案下也是如此)。

此方案的数据量是引用计数的数倍,并且还消除了缓存争用的一个主要点(引用计数必须从多个线程中写入,因此会破坏性能)。如果你不使用线程,它仍然会更快。

这是shared_ptr的适当用法。是的,使用计数将是递增的,因为将创建一个新的shared_ptr来推送。