【发布时间】: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