我曾被要求增加线程优先级来解决问题.我拒绝了,说改变它是危险的,并不是问题的根本原因.
我的问题是,在什么circumstannces 应该我conider改变线程的优先级?
当你创建了一个正在使用的线程列表并为它们定义了一个优先顺序,这对它们的工作有意义.
如果你在这里和那里轻推线程以避开问题,那么最终它们都将成为高优先级并且你回到了你开始的地方.当你确实需要锁定时,不要假设你可以通过优先级来修复竞争条件,因为你很可能只是在友好的条件下修复它.可能仍然存在可能失败的情况,例如当优先级较低的线程经历优先级继承时,因为另一个高优先级线程正在等待它持有的另一个锁.
如果按照"这些线程填充音频缓冲区"的方式对线程进行分类,"这些线程使我的应用程序响应系统事件","这些线程使我的应用程序响应用户","这些线程正在开展一些业务并且会报告他们什么时候做好并准备好",那么线程应该相应地优先考虑.
最后,它取决于操作系统.如果线程优先级完全是进程优先级的次要优先级,则优先处理线程不应该是"危险的":你唯一可以饿的CPU就是你自己.但是,如果您的高优先级线程优先于其他不相关的应用程序的普通优先级线程运行,那么您将负有更广泛的责任.你应该只提出做少量紧急工作的线程的优先级."小"的定义取决于您所使用的设备类型 - 使用3GHz多核处理器可以获得很多,但移动设备可能具有用户级应用可能会破坏的伪实时期望.
保持音频缓冲区的服务是何时成为高优先级的典型例子,因为小的欠载通常会导致讨厌的噼啪声.长时间下载(或其他慢速I/O)是何时成为低优先级的规范示例,因为如果下一个数据无论如何都不会存在多年,则没有紧急处理这一块数据.如果您正在编写设备驱动程序,则需要做出更复杂的决策,以便与其他人一起玩得很好.