1

我有一个接收数据并计算它的 udp 服务器。

每个角色我都有两个线程。

在我的 cpu 中有一个 8 多核,我以不同的速度发送数据。

但在最大情况下,我只使用了我的 cpu 两个核心 50% 的 %14%。如果我发送更多数据值,我的缓冲区将被填满并且不使用更多 CPU。

为什么每个核心只出现 50% 而不是更多?

我认为将这两个角色划分为多核。

我想确保每个都在其他核心上。

我如何明确选择在其他核心上运行的每个线程?

我的程序在 c++ visaul studio 9 上运行并在 windows7 上运行,我使用 boost::thread。

4

4 回答 4

4

调度程序将处理您的线程等将运行的位置。这是特定于操作系统的,因此如果您想尝试更改代码的运行方式,您将需要一个特定于操作系统的 API,它可以让您设置线程关联等。

此外,取决于您的应用程序是什么样的,从外观上看它是一个客户端服务器,因此它并不完全受 CPU 限制。您总共有多少个线程,您提到每个角色 2 个?一个线程只能在一个 CPU 上运行。尝试制作可以真正并行运行的工作单元,这样它们就可以真正独立运行,最好是在不同的内核上运行。

操作系统通常会很好地运行您的代码,因为它会有更好的整体画面。

于 2012-10-14T09:03:02.883 回答
1

您不能让一个线程使用多个内核。为了获得更好的 CPU 利用率,您需要重新设计程序以创建更多线程并让操作系统为您安排它们。无需手动将线程限制为特定内核。操作系统非常擅长弄清楚如何将内核分配给线程。

在您的情况下,如果数据计算任务占用大量 CPU,您可以为每个请求生成一个新线程,或者拥有一个工作线程池来挑选传入任务并处理它们。这只是想法之一。如果不了解更多关于您的应用程序架构和它试图解决的问题,很难说。

于 2012-10-14T09:03:59.430 回答
1

在每个线程中,您可以使用SetThreadAffinityMask来选择您的线程应该在其上运行的 CPU。但我建议您为每个传入请求创建一个新的工作线程(如果您使用线程池,您会看到相当大的性能提升)

于 2012-10-14T09:12:09.937 回答
0

请注意编译器和链接器设置启用多线程。

最佳实践也不是启动许多线程,而是启动长寿命线程,这些线程执行一些排队工作,例如计算或下载。

于 2021-08-26T11:38:43.043 回答