我应该何时考虑更改线程优先级

时间:2008-09-18 18:53:06

标签: multithreading language-agnostic

我曾被要求增加线程优先级以解决问题。我拒绝了,说改变它是危险的,并不是问题的根本原因。

我的问题是,在什么情况下应该我决定改变线程的优先级?

5 个答案:

答案 0 :(得分:6)

当你制作了一个你正在使用的线程列表并为它们定义了一个优先级顺序,这对它们的工作有意义。

如果你在这里和那里轻推线程以避免出问题,那么最终它们都将成为高优先级,并且你回到了你开始的地方。当你确实需要锁定时,不要假设你可以通过优先级来修复竞争条件,因为你很可能只是在友好的条件下修复它。可能仍然存在可能失败的情况,例如当优先级较低的线程经历优先级继承时,因为另一个高优先级线程正在等待它持有的另一个锁。

如果按照“这些线程填充音频缓冲区”的方式对线程进行分类,“这些线程使我的应用程序响应系统事件”,“这些线程使我的应用程序响应用户”,“这些线程正在开始有一些业务,并会在他们做好和准备时报告“,那么线程应该相应地优先考虑。

最后,它取决于操作系统。如果线程优先级完全是进程优先级的次要优先级,则优先处理线程不应该是“危险的”:你唯一可以饿的CPU就是你自己。但是,如果您的高优先级线程优先于其他不相关的应用程序的普通优先级线程运行,那么您将负有更广泛的责任。你应该只提出做少量紧急工作的线程的优先级。 “小”的定义取决于您所使用的设备类型 - 使用3GHz多核处理器可以获得很多,但移动设备可能具有伪实时期望,用户级应用可能会破坏。 / p>

保持音频缓冲区服务是何时成为高优先级的典型示例,因为小的欠载通常会导致讨厌的噼啪声。长时间下载(或其他慢速I / O)是何时成为低优先级的规范示例,因为如果下一个数据无论如何都不会存在多年,则没有紧急处理这一块数据。如果您正在编写设备驱动程序,则需要做出更复杂的决策,以便与他人合作。

答案 1 :(得分:2)

并不多。我唯一需要在方向上更改线程优先级的时间是使用用户界面线程。 UI必须非常快速才能使应用程序感觉正确,因此很多时候最好将绘制线程优先于其他线程。例如,Swing Event Dispatch Thread默认以优先级6运行(比默认值高1)。

我确实优先推动线程优先级。同样,这通常是为了保持UI的响应性,而一些长时间运行的后台进程可以做到这一点。但是,这有时也适用于我知道的轮询守护进程等,我不想干涉任何事情,无论干扰有多小。

答案 2 :(得分:1)

我们的应用程序使用后台线程来下载数据,我们不希望干扰单核机器上的UI线程,因此我们故意优先考虑更低的。

答案 3 :(得分:1)

我认为这取决于您正在考虑改变优先级的方向。

通常你不应该增加线程优先级,除非你有非常的理由。增加线程优先级可能会导致应用程序的线程开始从其他应用程序中取走时间,这可能不是用户想要的。如果你的线程耗尽了大量的CPU,它可能会使机器难以使用,因为一些标准的UI线程可能会开始饿死。

我会说,如果用户明确告诉您的应用程序这样做,那么您应该优先考虑将优先级提高到正常水平以上,但即使这样,您也希望阻止“无能为力”的用户这样做。也许如果你的应用程序没有正常使用多少CPU,但可能会有短暂的非常重要的活动,那么可以优先考虑增加优先级,因为它通常不会降低用户的一般体验。

降低优先级是另一回事。如果您的应用程序正在执行需要大量CPU并且运行很长时间但仍不重要的事情,那么降低优先级可能会很好。通过降低优先级,您可以在需要时将CPU用于其他事情,这有助于保持系统快速响应。只要系统大部分闲置在您的应用程序以外,您仍然可以获得大部分CPU时间,但不会从需要它的任务中获取比您更多的任务。一个例子是一个索引硬盘驱动器的线程(想想谷歌桌面)。

答案 4 :(得分:0)

我想说当你对线程的原始设计假设不再有效时。

线程优先级主要是关于哪些工作最重要的设计决策。因此,对于何时重新考虑的一些示例:如果添加可能需要其自身线程变得更重要的新功能,则重新考虑线程优先级。如果某些要求发生变化,迫使您重新考虑您正在进行的工作的优先级,那么请重新考虑。或者,如果您进行性能测试并意识到您的设计中指定的“高优先级工作”无法获得所需的性能,那么请调整优先级。

否则,它经常是黑客攻击。