C++多线程服务器帮助

3
我正在使用boost-asio在C++中开发一个多线程服务器。目前我遇到的设计问题涉及删除连接。
我有一个单一的服务器实例,它持有一个连接对象向量。这些连接接收我解析的命令。其中一个命令是将数据发送到我的向量中的所有连接。
现在当一个连接断开时,我当前正在从向量中删除此连接并调用析构函数。当有人同时进行“SendAll”和“Disconnect”操作时,似乎我会遇到问题。
请问是否有更好的设计方法或指导方向?非常感谢任何帮助。谢谢
2个回答

5
无论是什么类维护这个连接的向量,都需要一个strand。访问、添加或删除该向量时,请使用strand::poststrand::dispatchstrand concept在文档中有详细解释。

串定义为事件处理程序的严格顺序调用(即没有并发调用)。使用串允许在多线程程序中执行代码,而无需显式锁定(例如使用互斥锁)。


@kisplit 很高兴能够帮助。如果您需要更多关于asio的帮助,请随时提出更多问题。 - Sam Miller

1

把 vector 放入锁定中不是一个选项吗?首先让对 vector 的每次访问都获取一次锁;这将防止竞态条件。只要服务器连接不是非常频繁的进出,这不会成为瓶颈。


在可能的情况下,您应该优先使用asio strand而不是mutex。 - Sam Miller
谢谢你的建议!我选择了Sam的帖子,因为它使用了asio中的strand,但我也发现你的帖子非常有帮助。 - flumpb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接