项目:典型的聊天程序。服务器必须从多个客户端接收文本,并将每个输入传送给所有客户端。
在服务器中,我希望每个客户端都有一个包含套接字fd和std :: queue的结构。每个结构都在std :: list上。
当从客户端套接字接收到输入时,我想迭代结构列表并将新输入放入每个客户端结构的队列中。字符串是新的[ed]因为我不希望字符串的副本乘以所有客户端。但是我也想避免让多个指针分散到字符串并确定何时最终删除字符串的头痛。
这是共享指针的适当选择吗?如果是这样,每当我将它们推入队列时,shared_ptr是否会递增,而当我从队列中弹出它时它会递减?
感谢您的帮助。
答案 0 :(得分:4)
这是一种伪垃圾收集器系统比引用计数更好的情况。
您只需要一个字符串列表,因为您“将所有输入都传递给所有客户”。因为您将添加到另一端并从另一端删除,所以deque
是适当的数据结构。
现在,每个连接只需要跟踪它发送的最后一个字符串的索引。定期(每收到1000条消息,或者每接收4MB消息,或者类似的消息),您可以在所有客户端中找到此索引的最小值,并删除到此为止的字符串。此定期检查还可以检测远远落后的客户端(可能断开连接)并恢复。如果没有这个检查,单个卡住的客户端将导致程序泄漏内存(即使在引用计数方案下)。
此方案的数据比引用计数少几倍,并且还删除了一个主要的缓存争用点(引用计数必须从多个线程写入,因此它们会破坏性能)。如果你没有使用线程,它仍然会更快。
答案 1 :(得分:2)
这是对shared_ptr
的恰当使用。是的,使用次数将增加,因为将创建一个新的shared_ptr
来推送。