我理解什么是优先级继承。从Mars Pathfinder的系统重置问题中,我也了解到,根据操作的关键性,大多数情况下启用/实现优先级继承是有益的。
然而,是否存在一些情况下不希望启用/实现优先级继承甚至可能导致问题的情况呢?如果有,请提供一个例子并描述问题(最好)。
我理解什么是优先级继承。从Mars Pathfinder的系统重置问题中,我也了解到,根据操作的关键性,大多数情况下启用/实现优先级继承是有益的。
然而,是否存在一些情况下不希望启用/实现优先级继承甚至可能导致问题的情况呢?如果有,请提供一个例子并描述问题(最好)。
OP举了一个例子,说明何时需要使用优先级继承。在这个例子中,我们有最高和最低优先级的线程之间进行短暂的互斥保护事务,以及运行时间较长的中等优先级线程,如果不使用优先级继承,它可能会阻塞该事务。此外,在这个例子中,高优先级线程比中优先级线程更重要。
为了使优先级继承不可取,我们可以制作一个假设与上面的示例相反的应用程序。让我们将最高和最低优先级的线程之间的事务设置为比中等优先级线程执行其任务所需的时间更长。并假设中等优先级线程的结果比高优先级线程的结果更重要。
想象一下一个应用程序,它应该使用其高优先级线程提供100次中断每秒。用中等优先级线程提供10次中断每秒(每个中断需要30毫秒来处理)。低优先级线程可以锁定某些资源(与高优先级线程一起使用)。有时候(很少)它可能会长时间锁定它(1秒)。通过优先级继承,高优先级线程对此资源的第一次访问会提升后台线程的优先级长达1秒钟。使中等优先级线程会错过10个中断。同时高优先级线程可能会错过100个中断。如果中等优先级线程提供的中断更有价值,则应该选择禁用优先级继承。
我从未见过像这样的实际应用程序。所以我发明了一个来说明这种情况。让它成为一个视频捕获应用程序,具有一些计算机视觉任务(作为额外奖励)和声音记录。媒体优先级线程捕获视频帧。高优先级线程捕获声音(否则视频捕获过程可能会阻塞相当大的声音中断部分)。视频被捕获到预分配的缓冲区。使用静音抑制捕获音频(不需要内存来捕获静音)。因此,音频线程需要动态分配的内存块(这是我们的共享资源)。计算机视觉任务有时也会分配内存块。当我们没有内存可用时,垃圾收集器线程会阻止内存分配并执行一些工作。在没有优先级继承的情况下,视频捕获可以无缝工作。但是通过优先级继承,音频线程有时会阻止视频捕获(这在该应用程序中被认为是不好的)。
还有一些应用程序,优先级继承没有任何好处:
如果在这种情况下启用优先级继承,则可能只会导致某些性能(