【问题标题】:Change thread priority更改线程优先级
【发布时间】:2012-01-05 12:44:18
【问题描述】:

我正在尝试更改线程的优先级,但无法使其正常工作。我制作了一个按钮,可以在低和高之间切换优先级,当我在作业列表中检查时,优先级会发生变化。但是CPU使用率没有改变。我想知道这是否只是因为我没有使用完整的 CPU 能力,或者这是怎么回事。

我不是在问这是否是个好主意。我在问怎么做。

这是我更改优先级的方法。这是类后面的代码:

    private Thread tr;

    public MainWindow()
    {
        InitializeComponent();

        tr = new Thread(new ThreadStart(infiniteLoop));
        tr.Start();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (Process.GetCurrentProcess().PriorityClass == ProcessPriorityClass.High)
        {
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle;
            tr.Priority = ThreadPriority.Lowest;
            description.Text = "Idle";
        }

        else
        {
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
            tr.Priority = ThreadPriority.Highest;
            description.Text = "High";
        }
    }

    private void infiniteLoop()
    {
        while (true)
        {
        }
    }

【问题讨论】:

  • 搞乱线程或进程优先级通常是个坏主意。
  • @Nicholas Butler:哦,我明白了,微软公开线程管理 API 只是为了好玩 :)
  • @IgorKorkhov 他说的是一般地,而不是无条件地。这个问题被标记为wpf - 它不会向我尖叫“我需要高级线程调度”。
  • 它确实有它的用途。在机器经常满载/过载的环境中(即当就绪线程的数量通常大于 CPU 内核的数量时),提高 I/O 绑定进程/线程的优先级可以帮助进程保持紧密吞吐量/延迟目标,同时对没有此类硬限制的其他 CPU 密集型应用程序的影响最小。无论如何,许多操作系统都会将优先级提升应用于在 I/O 驱动程序中断后准备就绪的线程,只是为了自动促进这种优化。
  • 请注意:我这样做非常罕见,应格外小心(例如防止线程饥饿)。

标签: c# wpf multithreading thread-priority


【解决方案1】:

它没有按照我的预期工作 - 即,低优先级的进程以某种方式被限制为 x% 的 CPU 时间。

具有任何优先级的单线程进程可以在一个内核上消耗 100% 的 CPU 时间。

当您有两个进程,一个优先级高于另一个,这两个进程会各自消耗 100% 的 CPU 时间,同时执行时,具有较高优先级的进程将获得所有 CPU 时间(假设是单核)而优先级较低的则根本不会进步。

进程的优先级仅用于确定调度程序将 CPU 时间片“分发”给进程的顺序。

【讨论】:

  • 哦...我刚刚意识到我的计算机中有 4 个内核....进程正在使用 25%。因此,与您所说的相比,它在一个核心上使用 100%,这正是您所说的。
  • 是的,没错。如果您希望单个进程能够有效地使用多个 CPU,请使用多个线程。 System.Threading.Tasks 在 .NET 4.0 中对此非常有用,它比普通的旧 System.Threading 简单得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2010-10-10
  • 2010-10-10
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
相关资源
最近更新 更多