1

我有一个普遍的问题:

我的程序将继续处理不需要用户输入或系统资源(如打印机等)的东西,这意味着我的程序不会等待除 CPU 时间以外的任何资源。

同一个程序(假设是作业)可能由多个用户启动。

在这种情况下,是否值得在一个线程中运行它(这意味着每个用户都会感觉到他的工作被毫不拖延地执行。还是顺序运行这些工作更好?

作为单独线程运行的问题是,同时运行的线程过多,导致 CPU 利用率超过 100%。

请建议。假设用户看不到他的工作进度。当他的工作完成时,用户并不担心。但同时,我想让 CPU 忙于运行作业。

4

4 回答 4

1

如果您不在乎一个进程需要多长时间,或者它所花费的时间长度是可以接受的,那么使用一个线程可能是最简单的解决方案。例如,许多 GUI 应用程序只使用一个事件处理线程。

如果您想让所有 CPU 保持忙碌,您可以启动多个忙碌循环以最大化所有 CPU。

您通常想要的是减少延迟,或通过使用更多 CPU 来提高线程输出。除非这是一个目标,否则使用更多 CPU 对您没有帮助。

于 2012-06-26T13:42:10.297 回答
0

如果线程真正纯粹受 CPU 限制,那么创建比可用于处理它们的内核(或虚拟内核)更多的线程是没有意义的。所以在四核机器上,创建不超过四个线程(可能只有三个,因为你的进程不是机器上唯一发生的事情)。在具有超线程(每个内核两个虚拟线程)的四核机器上,您可能会创建六个或七个。创建太多额外的线程(比如数百个)会导致不必要的上下文切换,如果你真的过度使用它可能会很昂贵。

反之,在多核机器上,单线程只能在一个核上运行。因此,在四核机器上,在单个线程上按顺序运行作业只会占用 25% 的 CPU 容量。

所以:并行运行作业,直到可用内核的数量,然后按顺序(在每个内核上)运行。

大警告:您的里程可能会有所不同。这个等式有很多输入,包括机器上发生的其他事情,特别是作业是否真的受 CPU 限制(与系统限制相反,例如 CPU 和 I/O 子系统等)。

于 2012-06-26T13:39:51.330 回答
0

我猜你的程序需要内存访问。内存访问可能很慢,并且您当时确实想运行处理器。限制同时运行的线程数的常见解决方案是使用线程池

于 2012-06-26T13:40:22.997 回答
0

在这种情况下,是否值得在一个线程中运行它(这意味着每个用户都会感觉到他的工作被毫不拖延地执行。还是顺序运行这些工作更好?

这很大程度上取决于工作。如果它是交互式的,那么立即运行它将为用户提供更好的界面。如果响应速度不是问题,那么您可能不想承担编写多线程程序的复杂性成本。

作为单独线程运行的问题是,同时运行的线程过多,导致 CPU 利用率超过 100%。

我不会担心这个。我们使用多线程的原因之一是我们可以利用多个处理器来实际更快地完成工作。在这种情况下,根据操作系统的不同,如果您使用的 CPU 不止一个完整的 CPU,您实际上可以看到超过 100% 的进程负载——这是预期的。此外,如果 CPU 超过 100%,操作系统会很好地处理它,除非您担心您的应用程序会占用更重要的应用程序的周期。

于 2012-06-26T13:40:56.777 回答