我有一个接收数据并计算数据的udp服务器。
每个角色我有两个线程。
在我的 cpu 中是一个 8 多核,我以不同的速度发送数据。
但最多我使用 14% 的 CPU 两核 50%。 如果我发送更多数据值,我的缓冲区将填满并且不使用更多 CPU。
为什么每个核心只出现 50% 而不是更多?
我认为将这两个角色划分为多核。
我想确保每个核心都在其他核心上。
我如何明确选择在其他内核上运行的每个线程?
我的程序在C ++ visaul Studio 9上运行,在Windows7上运行,我使用boost::thread。
调度程序将处理线程等的运行位置。这是特定于操作系统的,因此,如果您想尝试更改代码的运行方式,则需要一个特定于操作系统的 API,允许您设置线程相关性等。
此外,取决于您的应用程序是什么样的,它的外观是一个客户端服务器,因此它不完全受 CPU 限制。您总共有多少线程,您提到每个角色 2 个?一个线程只能在一个 CPU 上运行。尝试制作可以真正并行运行的工作单元,这样它们就可以真正独立运行,理想情况下在不同的内核上运行。
操作系统通常会很好地运行您的代码,因为它将具有更好的整体情况。
不能使一个线程使用多个内核。为了获得更好的 CPU 利用率,您需要重新设计程序以创建更多线程,并让操作系统为您安排它们。无需手动将线程限制为特定内核。操作系统非常擅长弄清楚如何将内核分配给线程。
在您的情况下,如果数据计算任务占用大量 CPU,则可以为每个请求生成一个新线程,或者拥有一个工作线程池来选取传入的任务并处理它们。这只是一个想法。如果不详细了解您的应用程序体系结构及其试图解决的问题,就很难说。
在每个线程中,您可以使用 SetThreadAffinityMask 来选择线程应该在其上运行的 CPU。但我建议你为每个传入的请求创建一个新的工作线程(如果你使用线程池,你会看到相当大的性能提升)
请注意编译器和链接器设置是否启用多线程处理。
最佳做法也不是启动许多线程,而是启动长寿命线程,这些线程执行一定数量的排队工作,例如计算或下载。