我正在使用boost-asio在C++中使用多线程服务器。目前我遇到了一个设计问题,就是处理擦除连接的问题。C++多线程服务器帮助
我有一个服务器实例,它包含连接对象的向量。这些连接接收我解析的命令。一个命令特别处理向我的向量中的所有连接发送数据。
现在,当连接断开连接时,我正在从矢量中删除此连接并调用析构函数。看起来好像我会在某人'断开连接'的同时发生'SendAll'时遇到问题。
任何人都可以推荐一个更好的设计或只是指向正确的方向吗?任何帮助不胜感激。谢谢
我正在使用boost-asio在C++中使用多线程服务器。目前我遇到了一个设计问题,就是处理擦除连接的问题。C++多线程服务器帮助
我有一个服务器实例,它包含连接对象的向量。这些连接接收我解析的命令。一个命令特别处理向我的向量中的所有连接发送数据。
现在,当连接断开连接时,我正在从矢量中删除此连接并调用析构函数。看起来好像我会在某人'断开连接'的同时发生'SendAll'时遇到问题。
任何人都可以推荐一个更好的设计或只是指向正确的方向吗?任何帮助不胜感激。谢谢
无论什么类维护这个连接矢量需要一个strand。访问,添加或从矢量中删除时,使用strand::post
或strand::dispatch
。文档中详细解释了strand concept。
甲链被定义为事件的严格顺序 调用 处理程序(即,没有并发 调用)。线的使用允许 程序在多线程 程序中的执行,而不需要明确的 锁定(例如使用互斥体)。
围绕矢量锁定不是一个选项吗?对矢量的每个访问都首先获得一个锁;这将阻止你的竞争条件。只要服务器连接不经常发生,它就不会成为瓶颈。
如果可能的话,您应该更喜欢使用asio链而不是mutex。 – 2011-01-09 16:00:17
感谢您的建议!我选择了Sam的帖子,因为它使用asio的链,但我发现你的帖子也非常有帮助。 – flumpb 2011-01-11 01:41:46