C++ 多线程服务器帮助
Posted
技术标签:
【中文标题】C++ 多线程服务器帮助【英文标题】:C++ Multithreaded server help 【发布时间】:2011-01-09 15:46:26 【问题描述】:我正在使用 boost-asio 在 C++ 中开发多线程服务器。目前我遇到的一个设计问题是删除连接。
我有一个服务器实例,其中包含一个连接对象向量。这些连接接收我解析的命令。一个命令特别处理向我的向量中的所有连接发送数据。
现在,当连接断开时,我正在从向量中删除此连接并调用析构函数。当有人“SendAll”同时有人“断开连接”时,我似乎会遇到问题。
谁能推荐一个更好的设计或者只是指出我正确的方向?非常感谢任何帮助。谢谢
【问题讨论】:
【参考方案1】:维护这个连接向量的任何类都需要strand。访问、添加或删除向量时,请使用strand::post
或strand::dispatch
。 strand concept 在文档中有详细解释。
链被严格定义为 事件的顺序调用 处理程序(即没有并发 调用)。使用股线允许 在多线程中执行代码 程序无需显式 锁定(例如使用互斥锁)。
【讨论】:
@kisplit 很高兴为您提供帮助。如果您需要更多帮助,请随时询问有关 asio 的更多问题。【参考方案2】:在向量周围加锁不是一种选择吗?让对向量的每次访问都首先获得一个锁;这将阻止您的比赛条件。只要服务器连接的来去不频繁,就不会成为瓶颈。
【讨论】:
您应该尽可能使用 asio 链而不是互斥体。 感谢您的建议!我选择了 Sam 的帖子,因为它使用了来自 asio 的 strand,但我发现您的帖子也非常有帮助。以上是关于C++ 多线程服务器帮助的主要内容,如果未能解决你的问题,请参考以下文章
简单的多线程帮助? C++、WaitForSingleObject 和同步