【问题标题】:C++ IO/Multiplexed TCP Server and POSIX ThreadsC++ IO/多路复用 TCP 服务器和 POSIX 线程
【发布时间】:2015-04-22 12:05:28
【问题描述】:

我必须开发一个简单的 C++ 命令行客户端/服务器聊天应用程序。此应用程序必须提供基本的多方两方聊天室实现。是否可以将 IO/多路复用(select() 系统调用)与 POSIX 线程结合起来? 我的意思是我想创建一个 TCP 服务器,它使用 select() 处理多个客户端,当一个客户端想要与另一个客户端聊天时,serverwr 创建一个单独的线程,它使用 IO/Multiplexing (select() syscall) 来处理通信两个客户之间。 这是一个好主意吗?不然怎么办?

【问题讨论】:

  • 可以组合这些方法,但不是真正需要的,只会使事情复杂化。当您有更多连接时,通常会组合这些方法,其中您有几个线程,每个线程都处理一组连接。如果你只有几个连接,并且它们需要相互通信,我推荐多路复用的方法。
  • 问题是我这样做是为了网络编程考试,并且明确要求同时使用线程和选择。
  • select() 与线程一起使用应该没有特别的问题,除了在一个线程中关闭作为另一个选择的一部分的文件描述符会产生未定义的结果,并且在描述符之间共享的 I/O线程应该(可能,我不知道这些操作是否总是原子的)由互斥锁保护。

标签: c++ multithreading select tcp


【解决方案1】:

对架构的粗略尝试......

将您的应用程序构建为两组线程(一组可能仅由一个线程组成)。

一个集合关心 TCP 连接,每个 TCP 连接都分配给集合中的一个线程,线程永远运行,轮询分配给它的连接(传入消息)并轮询(每个线程)来自逻辑队列(传出消息)

另一组注意逻辑/会话。每个会话都分配给一个特定的线程。每个线程永远运行,从网络队列(传入消息)轮询(每个线程)。

网络线程集接收消息并将它们发布到正确的逻辑队列[假设有一种将连接映射到内部逻辑会话的方法]。它轮询其来自逻辑队列以获取传出消息并发送它们。

网络线程数是有限制的,与连接数无关。

逻辑线程集,在其队列中接收来自网络的请求,并在给定的会话状态内处理它们,并且(可能)回发消息以发送出去(由网络线程发送出去)

逻辑线程数是有限制的,与会话数无关。

【讨论】:

  • 这是个好主意,我想我可以使用这种结构,但是如何添加对其他命令的支持,例如“列出服务器上的用户”、“处理注销”?
  • @GiorgioGambino,我猜当您收到传入消息时,它将被分派到为不同命令设置的逻辑线程中运行的不同事件处理程序方法/函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2018-01-23
  • 1970-01-01
  • 2016-09-26
  • 2021-05-09
  • 2018-05-11
相关资源
最近更新 更多