c++ - 何时创建多少个线程?

标签 c++ linux multithreading networking

我有一个网络 Linux 应用程序,它从多个目的地接收 RTP 流,进行非常简单的数据包修改,然后将流转发到最终目的地。

我如何决定我应该有多少线程来处理数据?我想,我无法为每个 RTP 流打开一个线程,因为可能有数千个。我应该考虑 CPU 内核的数量吗?还有什么重要的? 谢谢。

最佳答案

了解在服务器上使用多线程的目的很重要;服务器中的许多线程用于减少 latency而不是提高速度。您不会通过拥有更多线程来使 cpu 更快,但您更有可能在给定时间段内始终出现一个线程来处理请求。

拥有一堆并行移动数据的线程是一种相当低效的霰弹枪(为每个请求创建一个线程自然会完全失败)。使用 thread pool模式可以是一种更有效、更集中的减少延迟的方法。

现在,在线程池中,您希望拥有的线程至少与 CPU/核心数一样多。你可以拥有更多,但额外的线程只会减少延迟而不会提高速度。

将组织服务器线程的问题想象成类似于在 super 市场中组织一条线。您想要许多工作速度较慢的收银员还是一个工作速度超快的收银员?快速收银员的问题不在于速度,而在于一位拥有大量杂货的顾客可能仍会占用他们很多时间。对许多线程的需求来自于一些请求可能会花费大量时间并阻塞所有线程的可能性。通过这种推理,您是否受益于许多较慢的收银员取决于您拥有相同数量的食品杂货还是截然不同的数量。回到基本模型,这意味着您必须使用您的线程数来确定给定您的流量的特定特征什么是最佳的,查看处理每个请求所花费的时间。

关于c++ - 何时创建多少个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/510441/

相关文章:

java - 多线程加入并获取返回值

ruby - Thread#run 和 Thread#wakeup 之间的区别?

c++ - 类型转换会减慢程序运行吗?

linux - 通过在分配给 var 时返回空字符串,将命令的输出重定向到 sed 失败 - Bash Shell

multithreading - cudaDeviceSynchronize() 仅在当前 CUDA 上下文或所有上下文中等待完成?

linux - wget:获取匹配正则表达式的文件

linux - 无法在浏览器上打开远程安装的 Sonar

c++ - MKL 不适用于使用 Eigen 和 OpenMP 的 C++ 代码

c++ - 为RealBasic创建与C/C++库的绑定(bind)

c++ - 线程未正确结束 : it ignores failing loop conditions