c++ - 实现多线程 UDP 服务器(线程池?)的问题

标签 c++ c multithreading udp threadpool

我正在编写一个音频流媒体(客户端-服务器)作为我的一个项目(C/C++), 我决定为这个项目制作一个多线程 UDP 服务器。

这背后的逻辑是每个客户端都将在他自己的线程中处理。 我遇到的问题是线程相互干扰。

我的服务器做的第一件事是创建一种线程池;它创造了 5 所有被 recvfrom() 函数自动阻塞的线程, 虽然看起来,在大多数情况下,当我连接另一台设备时 到服务器,多个线程正在响应,稍后 这会导致服务器完全被阻止并且无法进一步运行。

调试起来也很困难,所以我按顺序写在这里 获得关于通常如何实现多线程 UDP 服务器的一些建议。

我应该在部分代码中使用互斥量还是信号量?如果有,在哪里?

任何想法都会非常有帮助。

最佳答案

退后一步:你说

each client will be handled in his own thread

但 UDP 不是面向连接的。如果所有客户端都使用相同的多播地址,则没有自然的方法来决定哪个线程应该处理给定的数据包。


如果您执着于每个客户端都有自己的线程的想法(我通常会反对,但在这里可能有意义),您需要一些方法来确定每个数据包来自哪个客户端。

这意味着要么

  • 使用 TCP(因为您似乎无论如何都在尝试面向连接的行为)
  • 读取每个数据包,找出它属于哪个逻辑客户端连接,并将其发送到正确的线程。注意,由于路由信息是全局/共享状态,所以这两个是等价的:

    1. 保留源 IP -> 线程映射,受互斥锁保护,从所有线程读取和访问
    2. 在单个线程中完成所有读取,使用本地源 IP -> 线程映射

    第一个似乎是你想要的,但它的设计很糟糕。当一个数据包进入时,您将唤醒一个线程,然后它锁定互斥锁并进行查找,并有可能唤醒另一个线程。您要处理此连接的线程也可能被阻塞读取,因此您需要一些机制来唤醒它。

    第二个至少给出了关注点的分离(读取/调度与处理)。


明智地,你的设计应该取决于

  • 客户数量
  • I/O 负载
  • 非 I/O 处理量(或 IO:CPU 比率,或...)

关于c++ - 实现多线程 UDP 服务器(线程池?)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041291/

相关文章:

c++ - 为什么 const 在 void/int 声明之后?

c - 如何检查 UTF-8 字符串是否以 'a' 开头

PHP + pthreads : Build one big object - parallel-processing

java - ArrayList方法导致Producer Consumer死锁

performance - 同时将变量更新为相同值的线程安全性

c++ - 是否有一种算法可以将 LAPACK 排列更改为真实排列?

c++ - 未定义的函数引用错误

c++ - 从 C 打开 Windows 文件/文件夹属性对话框

c - fread() 返回不正确的数据

C 如何在没有编译器警告的情况下将地址打印为十进制值(不是十六进制)