2011-01-09 89 views
3

我正在使用boost-asio在C++中使用多线程服务器。目前我遇到了一个设计问题,就是处理擦除连接的问题。C++多线程服务器帮助

我有一个服务器实例,它包含连接对象的向量。这些连接接收我解析的命令。一个命令特别处理向我的向量中的所有连接发送数据。

现在,当连接断开连接时,我正在从矢量中删除此连接并调用析构函数。看起来好像我会在某人'断开连接'的同时发生'SendAll'时遇到问题。

任何人都可以推荐一个更好的设计或只是指向正确的方向吗?任何帮助不胜感激。谢谢

回答

5

无论什么类维护这个连接矢量需要一个strand。访问,添加或从矢量中删除时,使用strand::poststrand::dispatch。文档中详细解释了strand concept

甲链被定义为事件的严格顺序 调用 处理程序(即,没有并发 调用)。线的使用允许 程序在多线程 程序中的执行,而不需要明确的 锁定(例如使用互斥体)。

1

围绕矢量锁定不是一个选项吗?对矢量的每个访问都首先获得一个锁;这将阻止你的竞争条件。只要服务器连接不经常发生,它就不会成为瓶颈。

+0

如果可能的话,您应该更喜欢使用asio链而不是mutex。 – 2011-01-09 16:00:17

+0

感谢您的建议!我选择了Sam的帖子,因为它使用asio的链,但我发现你的帖子也非常有帮助。 – flumpb 2011-01-11 01:41:46