multithreading - 我什么时候应该考虑更改线程优先级

标签 multithreading language-agnostic

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

我的问题是,在什么情况下我应该考虑更改线程的优先级?

最佳答案

当您列出您正在使用的线程并为它们定义优先级顺序时,这对于它们所做的工作是有意义的。

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

如果您按照“这些线程填充音频缓冲区”、“这些线程使我的应用程序响应系统事件”、“这些线程使我的应用程序响应用户”、“这些线程处理某些业务”对线程进行分类并会在它们准备好并准备好时进行报告”,那么线程应该相应地进行优先级排序。

最后,这取决于操作系统。如果线程优先级完全次于进程优先级,那么优先考虑线程不应该是“危险的”:你唯一可以耗尽 CPU 的就是你自己。但是,如果您的高优先级线程优先于其他不相关应用程序的正常优先级线程运行,那么您将承担更广泛的责任。您应该只提高执行少量紧急工作的线程的优先级。 “小型”的定义取决于您使用的设备类型——使用 3GHz 多核处理器可以避免很多问题,但移动设备可能具有用户级应用程序可能会破坏的伪实时期望。

然而,保持音频缓冲区服务是何时成为高优先级的典型例子,因为小的欠运行通常会导致令人讨厌的噼啪声。长时间下载(或其他慢速 I/O)是什么时候优先级低的典型例子,因为如果下一个数据不会出现很长时间,处理这块数据就没有紧迫性。如果您正在编写设备驱动程序,您将需要做出更复杂的决定,如何与其他人一起玩得更好。

关于multithreading - 我什么时候应该考虑更改线程优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/95649/

相关文章:

java - put() 之后哈希表仍为空

java - 线程 hibernate 时我无法运行任务

multithreading - Matlabpool 线程数与核心数

language-agnostic - 如何让非技术人员理解非 UI 问题?

language-agnostic - 使用示例解决方案进行编码练习

C++ fork()、多线程和操作系统的概念

windows - 我怎样才能告诉 Windows XP/7 在我的代码的特定段期间不要切换线程?

algorithm - BST 输入的可能排列

performance - 如何定位睡莲以进行蛙跳?

language-agnostic - 确定图中给定路径列表的边权重