【问题标题】:A synchronization primitive with increased owner thread priority具有增加的所有者线程优先级的同步原语
【发布时间】:2020-10-24 15:17:11
【问题描述】:

我有一个程序,有时会发生突发事件,因此如果可能的话,线程会将 CPU 加载到 100% 以上,但实际上,它们会为 CPU 而战。获得同步原语所有权的线程获得比应用程序的其他线程更高的优先级是至关重要的,这样可以防止线程获得所有权并被调度程序暂停的情况。 C++(最新草案)或 WinAPI 中是否有合适的同步原语,或者我是否必须将互斥锁定代码包装在 SetThreadPriority() 调用中?

【问题讨论】:

    标签: c++ multithreading winapi synchronization thread-priority


    【解决方案1】:

    这实际上不是问题。如果拥有同步原语的线程被调度程序暂停,那只是因为有足够的准备运行线程来保持所有内核忙碌。在这种情况下,没有特别的理由关心哪个线程运行。

    等待同步原语的线程尚未准备好运行。因此,如果您有四个内核并且持有同步原语的线程没有被阻塞,那只是因为有四个线程,都准备好运行,可以在不持有同步原语的情况下向前推进。在这种情况下,运行这四个线程与运行保存同步原语的线程一样好。

    我强烈建议你不要乱用线程优先级,除非你真的别无选择。一旦你开始搞乱线程优先级,上面的论点就会停止,因为你可能会遇到优先级反转等问题。但是如果你不搞乱线程优先级,那么你就不会遇到这类问题,调度程序将足够聪明,可以在 99% 的时间里做正确的事情。并且试图弄乱优先级以使其做正确的事情,持续 1% 的时间可能会适得其反。

    【讨论】:

    • 一些线程更重要,因为它们填充了其他线程的工作队列。并且处理时间不相等:线程 A 必须花费 1 秒才能为线程 B 产生 10 秒的工作。
    • @SergeRogatch 这些事情永远不会成为问题,原因有两个:1) 如果没有安排任何准备运行的线程,那么目前有足够的工作要做。 2)当有工作要做时,每个线程将获得大致相同的时间,因此需要较少时间来完成工作的线程不会被饿死。 (调度器很聪明。让它完成它的工作。)
    【解决方案2】:

    您正在寻找的机制称为优先继承协议。 Pthreads 为这种配置提供支持,其想法是,如果高优先级任务正在等待低优先级任务占用的资源,则低优先级任务将提升到该高优先级,直到它放弃资源。

    搜索 Liu 和 Layland,他们在 70 年代初写了大部分内容。至于 C++,恐怕距离 1973 年的最新技术还有几个版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多