我正在使用boost-asio在c ++中使用多线程服务器。目前我遇到的一个设计问题就是擦除连接。
我有一个服务器实例,它包含一个连接对象的向量。这些连接接收我解析的命令。一个命令特别处理向我的向量中的所有连接发送数据。
现在当连接断开连接时,我正在从向量中删除此连接并调用析构函数。当某人'SendAll'同时有人'断开'时,我似乎会遇到问题。
有人可以推荐更好的设计,还是只指向正确的方向?任何帮助非常感谢。感谢
答案 0 :(得分:5)
无论什么类维护这个连接向量都需要strand。访问,添加或删除向量时,请使用strand::post
或strand::dispatch
。 strand concept在文档中有详细解释。
一条链被严格定义 顺序调用事件 处理程序(即没有并发 调用)。使用股线允许 在多线程中执行代码 程序无需显式 锁定(例如使用互斥锁)。
答案 1 :(得分:1)
围绕矢量锁定不是一个选项吗?每次访问向量都会获得锁定;这将阻止你的竞争条件。只要服务器连接不经常出现,它就不会成为瓶颈。