【问题标题】:Multithread broadcast chat in C++C++中的多线程广播聊天
【发布时间】:2012-05-24 15:03:18
【问题描述】:

我必须在 C++ 中实现一个多线程广播聊天服务器(用于学校项目)。 我不能使用异步套接字,我在 Win32 下用 C++ 编写它(基于提升的解决方案可以)。

我的设计应该非常简单明了:一个“主”线程等待传入连接,当一个新连接到达时,它将它传递给线程池(旧版 API)中的一个(新)线程,以读取来自客户。

这是第一个问题:(A) 我应该将套接字传递给另一个(新)线程以写入客户端吗?或者 (B) 我应该使用同一个线程进行读写吗?或者 (C) 我应该使用一个独特的线程来写给所有客户吗? (再次,同步)。

如果我选择解决方案 A 或 B,当消息从客户端到达时,它应该以某种方式分派给所有其他连接的客户端:我是否应该将它放在单个(共享)变量中并使用一些同步构造来让所有线程还在等吗?我猜它应该类似于 reader/writer + barrier(动态大小),但我没有设法解决这个问题。

另一方面,如果我选择解决方案 C,我必须以某种方式迭代“套接字”的集合(例如 st::list)或“订阅者对象”的集合或类似的东西。在这种情况下,我主要关心的是如何管理从集合中取消(当然还有并行读取)。一个可能的解决方案是用相同的互斥锁锁定整个集合......但我认为它不会很好。

当然,我不希望你为我解决问题,但如果你能指出一些适合我的问题的模式或类似问题的解决方案,那将是完美的。 (不管怎样,这里的主要问题是广播!)

谢谢

【问题讨论】:

  • 当您提到“广播”时,您是指实际广播的 UDP 数据包(也就是发送到广播 IP 地址的数据包,以便它们将发送到本地以太网网段上的所有设备)还是您在说关于比喻意义上的广播——即将重复的单播数据发送到多个 IP 地址?

标签: c++ multithreading concurrency network-programming


【解决方案1】:

在完成这项任务时要问自己的主要问题与规模和响应能力有关。这些答案将有助于确定满足要求所需的架构。

Reactor 模式最符合您目前所概述的内容,并且与 boost::asio 非常吻合。 http://en.wikipedia.org/wiki/Reactor_pattern

【讨论】:

  • 好的,这可能是开始的正确点...我将深入研究boost::asio docs(实际上我有点不舒服,因为异步方法(不是因为我不喜欢它,但是因为我不确定它是否符合我的要求)
  • 我也不确定,因为为 10 个人以人类速度打字编写广播聊天服务器与为 10,000,000 人编写广播聊天服务器有很大不同,而不是所有人。
  • 这不是我的情况,但假设我必须开发“巨大”的东西......我应该选择 Reactor + 多线程解决方案吗? (当然,我不会开发这个,但我正在努力理解)。纯异步在单核方法中工作得很好,但在多核架构中不能很好地扩展,对吧? ——
  • 如果没有实际构建、实施和衡量它,答案将是“视情况而定”。有些人拥有一百万个 TCP 连接。 news.ycombinator.com/item?id=3028547
猜你喜欢
  • 2016-06-06
  • 2014-07-27
  • 2015-07-03
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多