我必须用c ++(用于学校项目)实现多线程广播聊天服务器。 我不能使用异步套接字,我在Win32下使用C ++编写它(基于boost的解决方案可以)。
我的设计应该非常简单明了:“主”线程等待传入连接,当新连接到达时,它将它传递给线程池(旧版API)中的(新)线程,以便从客户。
这是第一个问题:(A)我应该将套接字传递给另一个(新)线程以写入客户端吗?或(B)我应该使用相同的线程进行读写吗?或(C)我应该使用唯一的线程写入所有客户端吗? (再次,同步)。
如果我选择解决方案A或B,当消息从客户端到达时,它应该以某种方式分派给所有其他连接的客户端:我应该将它放在单个(共享)变量中并使用一些同步构造来拥有所有线程等待吗?它应该是像读者/作者+障碍(动态大小),我想,但我没有设法解决这个问题。
另一方面,如果我选择解决方案C,我必须以某种方式迭代'socket'的集合(例如st::list
)或'subscriber object'的集合或类似的东西。在这种情况下,我的主要关注点是如何从收集管理取消(当然,并行取消)。一个可能的解决方案是使用相同的互斥锁锁定整个集合....但我认为它不会很好。
由于
答案 0 :(得分:1)
要求自己解决这项任务的主要问题与SCALE和RESPONSIVENESS有关。这些答案将有助于确定满足要求所需的架构。
Reactor模式最符合您到目前为止所概述的内容,并与boost::asio
很好地融合。 http://en.wikipedia.org/wiki/Reactor_pattern