我啥时候应该使用 QThread::HighestPriority

Posted

技术标签:

【中文标题】我啥时候应该使用 QThread::HighestPriority【英文标题】:When should I use QThread::HighestPriority我什么时候应该使用 QThread::HighestPriority 【发布时间】:2016-08-19 11:48:08 【问题描述】:

    QThread (QThread::HighestPriority) 中使用 HighestPriority 有哪些好处和坏处?

    这会损害其他一些操作吗?

    我应该什么时候使用它?

【问题讨论】:

【参考方案1】:

    与低优先级的其他线程相比,调度程序将给予该线程更高的优先级。如果你要求一个永远不会产生的线程(例如,一个执行“繁重”计算而没有阻塞系统调用的线程)的最高优先级,那么你的低优先级线程可能会被 CPU 时间饿死。

    一个典型的例子是高优先级的工作线程与 GUI 线程竞争 CPU - 您的 GUI 可能大部分时间都没有响应。

    当然,细节取决于您的应用程序运行的操作系统的调度程序的确切工作方式。在 Windows 上,即使工作线程与具有相同优先级的 GUI 线程竞争,我也有过糟糕的经历。最近的 Linux 内核在这方面感觉好多了。

    在大多数操作系统上,线程优先级以某种方式与进程优先级结合在一起,因此它不应损坏太多其他进程。

    就个人而言,我从未使用过它。

    正如我在评论中所写,通常安排是相反的 - 你将 low 优先级分配给后台、占用 CPU 的任务;速度差异通常可以忽略不计(通常 GUI 线程和其他后台线程大部分时间都处于空闲状态,等待事件或定期轮询),但您可以让它们在需要时保持响应。

    高优先级线程的一个可能用途是软实时的东西,你的线程需要每隔一段时间被调度,抢占低优先级线程,快速完成它的事情并返回CPU 到调度程序。

【讨论】:

【参考方案2】:

请记住,如果您要提高除主线程之外的任何线程的优先级,则说明该线程正在执行的工作比保持用户界面响应所需的工作更重要。您的 UI 很乐意被最高优先级的线程抢占。

当响应延迟很重要时,应使用优先级很高的线程。他们应该做最少的必要工作。在这种情况下,高线程优先级意味着一旦线程可运行,就值得消耗执行上下文切换所需的 CPU 周期。那最好还是物有所值。通常您会使用高优先级线程进行音频或机器通信 - 但要注意例如设备驱动程序本身的 Linux 部分或它上面的层无论如何都可能在较低优先级的线程中运行!

【讨论】:

【参考方案3】:

    通过在 QT 应用程序中使用 HighestPriority,您将赋予该特定线程优先于应用程序中所有其他线程的优先级。如果您有多个线程并希望确保后台线程不会从主线程中窃取 CPU,这将很有用。伤害?除非被人为错误误用,否则不会造成太大伤害。

    除非您的应用程序占用 CPU,这通常是由错误或设计不当的代码造成的,否则不会造成太大的伤害。

    当您的应用程序需要同时执行多项操作但您想确保主窗口保持响应时,请使用它。显然要这样做,您只需分配主窗口 HighestPriority

【讨论】:

非常感谢@DanK。实际上,我只有 2 个线程(主窗口线程和创建的另一个线程),这个另一个线程必须进行一些繁重的计算。在这种情况下我应该使用 HighestPriority 还是没有必要?你有什么看法? 要求计算线程的高优先级几乎总是一个坏主意。您希望为这些线程提供 low 优先级,以保持 GUI 线程响应;无论如何,丢失的 CPU 时间应该可以忽略不计,因为在适当的 GUI 应用程序中,主线程 99% 的时间都在等待用户输入(或计时器)。 不客气,Kelvin Salton!它归结为您想要优先处理的线程。如果 CPU 是有限的(有时可能是系统上的其他东西占用了它),那么分配了 HighestPriority 的 QT 线程将更加敏感。

以上是关于我啥时候应该使用 QThread::HighestPriority的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:我啥时候应该使用 refreshToken?

我啥时候应该使用助手? [关闭]

我啥时候应该使用“while 循环”?

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该使用导航控制器?