这是shared_ptr的适当用途吗
Is this an appropriate use for shared_ptr?
项目:典型的聊天程序。服务器必须接收来自多个客户端的文本,并将每个输入扇出到所有客户端。
在服务器中,我希望每个客户端都有一个包含套接字fd和std::队列的结构。每个结构都将在std::列表中。
当从客户端套接字接收输入时,我想迭代结构列表,并将新输入放入每个客户端结构的队列中。字符串是新的,因为我不希望字符串的副本在所有客户端上相乘。但我也想避免让多个指向字符串的指针分散开来,并决定何时最终删除该字符串的麻烦。
这是共享指针的合适时机吗?如果是,那么shared_ptr是否在每次将它们推入队列时递增,而在从队列中弹出时递减?
谢谢你的帮助。
在这种情况下,伪垃圾收集器系统的工作性能将比引用计数好得多。
您只需要一个字符串列表,因为您"将每个输入扇出到所有客户端"。因为您将添加到一端并从另一端删除,所以deque
是一个合适的数据结构。
现在,每个连接只需要跟踪它发送的最后一个字符串的索引。每隔一段时间(每收到1000条消息,或每收到4MB消息,或诸如此类),您就会在所有客户端中找到该索引的最小值,并删除到此为止的字符串。这种定期检查也是一个机会,可以检测远远落后的客户端(可能断开连接)并进行恢复。如果不进行此检查,单个卡住的客户端将导致程序内存泄漏(即使在引用计数方案下也是如此)。
此方案的数据量是引用计数的数倍,并且还消除了缓存争用的一个主要点(引用计数必须从多个线程中写入,因此会破坏性能)。如果你不使用线程,它仍然会更快。
这是shared_ptr
的适当用法。是的,使用计数将是递增的,因为将创建一个新的shared_ptr
来推送。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理