C++ 多线程服务器帮助

Posted

技术标签:

【中文标题】C++ 多线程服务器帮助【英文标题】:C++ Multithreaded server help 【发布时间】:2011-01-09 15:46:26 【问题描述】:

我正在使用 boost-asio 在 C++ 中开发多线程服务器。目前我遇到的一个设计问题是删除连接。

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

现在,当连接断开时,我正在从向量中删除此连接并调用析构函数。当有人“SendAll”同时有人“断开连接”时,我似乎会遇到问题。

谁能推荐一个更好的设计或者只是指出我正确的方向?非常感谢任何帮助。谢谢

【问题讨论】:

【参考方案1】:

维护这个连接向量的任何类都需要strand。访问、添加或删除向量时,请使用strand::poststrand::dispatch。 strand concept 在文档中有详细解释。

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

【讨论】:

@kisplit 很高兴为您提供帮助。如果您需要更多帮助,请随时询问有关 asio 的更多问题。【参考方案2】:

在向量周围加锁不是一种选择吗?让对向量的每次访问都首先获得一个锁;这将阻止您的比赛条件。只要服务器连接的来去不频繁,就不会成为瓶颈。

【讨论】:

您应该尽可能使用 asio 链而不是互斥体。 感谢您的建议!我选择了 Sam 的帖子,因为它使用了来自 asio 的 strand,但我发现您的帖子也非常有帮助。

以上是关于C++ 多线程服务器帮助的主要内容,如果未能解决你的问题,请参考以下文章

简单的多线程帮助? C++、WaitForSingleObject 和同步

C++服务器设计:多线程模型设计

用于事件驱动作业的 C++ 多线程或多处理服务器

Linux多线程服务端编程:使用muduo C++网络库

多线程在 C++ 中的 Windows 中将多个客户端连接到单个服务器

c++ 多线程编程