3

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

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

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

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

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

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

谢谢

4

1 回答 1

1

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

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

于 2012-05-24T17:01:30.013 回答