如果您只有一个核心,那么多线程可以帮助您的唯一方法是,如果该工作的大部分依赖于 CPU 以外的其他东西,那么一个线程可以完成一些工作,而另一个线程正在等待来自磁盘或网络连接。
如果您的应用程序有一个 GUI,那么它可以从多线程中受益,因为它不会更快地进行处理(实际上更慢,尽管如果任务很长可能可以忽略不计),它仍然可以同时对用户输入做出反应。
如果您有两个或更多内核,那么您也可以在 CPU 密集型操作中获得收益,尽管这样做从微不足道到不可能,具体取决于该操作是什么。这与您的情况无关,但如果您编写的代码以后可以在多核系统上运行,则通常值得考虑。
不过,提高优先级可能是个坏主意,尤其是如果您只有一个内核(多核系统的一个优点是提高优先级的人不会造成太大的伤害)。
所有线程都有优先级,这是它们的进程优先级和在该进程中的优先级的一个因素。高优先级进程中的低优先级线程胜过低优先级进程中的高优先级线程。
调度程序以循环方式将 CPU 切片分配给有工作要做的最高优先级线程。如果还有剩余的 CPU(在您的情况下,这意味着如果该优先级的线程为零需要运行),那么它将切片分配到下一个最低优先级,依此类推。
大多数时候,无论如何,大多数线程都没有做太多事情,这可以从大多数系统上的大多数时间 CPU 使用率低于 100% 标记的事实中看出(超线程扭曲了这一点,内部调度cores 意味着超线程系统可以完全饱和,并且似乎仅以低至 70% 运行)。无论如何,通常事情都会完成,突然有很多事情要做的线程会以正常优先级在几乎相同的时间以更高的优先级执行。
然而,虽然较高优先级的繁忙线程的好处通常很少或根本没有,但减量却很大。由于它是唯一获得任何 CPU 时间的线程,因此所有其他线程都被卡住了。因此,所有其他进程都会挂起一段时间。最终调度器注意到它们都已经等待了大约 3 秒,并通过将它们全部提升到最高优先级并给予它们比正常更大的切片来解决这个问题。现在我们有一个活动的爆发,因为没有时间的线程都突然成为所有需要 CPU 时间的最高优先级线程。除了高优先级的线程之外,每个线程都有一个突增,并且系统停止崩溃,尽管可能仍然有很多应用程序在其标题栏中显示“无响应”。这远非理想,但它是处理比通常优先级更高的线程抢占内核这么长时间的有效方法。
线程的优先级逐渐下降,最终我们又回到了只有一个更高优先级的线程才能工作的情况。
为了额外的乐趣,如果我们的高优先级线程以任何方式依赖于低优先级线程提供的服务,它最终会被卡住等待它们。希望以某种方式使其阻塞并阻止自己造成任何伤害,但可能不会。
总之,线程优先级要谨慎处理,进程优先级更是如此。只有当它们能够快速产生并且对其他线程的工作至关重要(例如,某些操作系统进程将以更高的优先级完成,.NET 中的终结器线程将高于进程的其余部分时,它们才真正有效,等),或者如果亚毫秒级的延迟会搞砸(一些密集的媒体工作需要这样做)。