我一直在脑海中传递一些关于如何在保持 KISS 的同时使用 IO 类型的架构实际包含大量连接的想法。通过网络上的示例,似乎大多数人都使用带有 CONTAINING_RECORD 的双/单链表。而且,作为 IO 服务器的新手(尽管每天都在进步),我也将链表容器用于 IO 架构。
我的问题是,为什么我不能只构建一个大数组并使用 CONTAINING_RECORD,而不是为我的连接使用单/双链表?我可以使用 STL vector 吗?那行得通吗?此外,还有哪些其他类型的容器最适合大型 IO 服务器。
我正在为我的游戏服务器重写服务器架构(经过多次修改),这次我想朝着正确的方向前进,因为我不想在不久的将来再次重写它。
感谢您的宝贵时间和回复。
编辑:目前我的服务器架构是(简而言之):
Main thread listening and accepting -> Pass over the socket into a container.
Worker threads(2-3) grab IO events for the container of sockets.
Worker threads Read/Write Data on that container.
主线程和工作线程都使用链表。我想摆脱这个。
最佳答案
您的“连接列表”可能会从任何位置删除,而不仅仅是结尾。对于 std::vector
,删除中间的元素是一个 O(N) 操作,但对于链表它可以是 O(1)。 (对于单链表,这不是微不足道的,可能需要一个不方便的 API)。
std::map
可能是一个有趣的选择,因为它提供 O(log N)
查找和删除元素。
关于C++ IOCP 服务器容器信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364139/