修改线程优先级

3
我试图改变一个线程的优先级,但是我无法使其起作用。我已经创建了一个按钮来在低优先级和高优先级之间切换,当我在作业列表中检查时,优先级已被更改。但 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)
        {
        }
    }

3
调整线程或进程的优先级通常是不好的做法。 - Nick Butler
4
我明白了,你的意思是微软公开线程管理API只是为了好玩 :) - Igor Korkhov
1
@IgorKorkhov 他说的是“一般情况”,而不是“绝对情况”。这个问题标记了 wpf - 对我来说并不需要高级线程调度。 - ta.speot.is
1
它确实有其用处。在机器经常被完全加载/超载的环境中,(即当可用线程数经常大于CPU核心数时),提高I/O绑定进程/线程的优先级可以帮助该进程保持紧密的吞吐量/延迟目标,同时最小化对其他CPU密集型应用程序的影响,这些应用程序没有这样的硬性限制。许多操作系统无论如何都会为在I/O驱动程序中断后变得就绪的线程应用优先级提升,以自动促进此优化。 - Martin James
1
只是提醒一下:我很少这样做,应该非常谨慎对待(例如,防止线程饥饿)。 - Jeb
显示剩余4条评论
1个回答

5

我认为它的工作方式和你期望的不一样——即优先级较低的进程能被限制在x%的CPU时间上。

一个单线程的进程,无论其优先级如何,都可以在一个核心上消耗100%的CPU时间。

当你有两个进程,一个优先级高于另一个,它们各自独立地占用100%的CPU时间时,具有更高优先级的那一个会获得所有CPU时间(假设只有一个核心),而优先级较低的那个则根本不会有任何进展。

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


哦...我才意识到我的电脑有4个核心....进程正在使用25%。所以与你所说的相比,在一个核心上它使用了100%,这正是你所说的。 - 7heViking
没错,如果你想让一个进程能够有效地使用多个CPU,就要使用多个线程。在.NET 4.0中,System.Threading.Tasks非常适合这种情况,比普通的System.Threading简单得多。 - tomfanning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接