为什么Thread.Sleep(0)时间片处理优先级较低的线程?

Ale*_*xey 3 c# multithreading thread-priority

据我所知,Thread.Sleep(0)只为具有相同或更高优先级的另一个线程提供时间片.我做了一些测试应用:

class Program
{
    public static void ThreadMethod()
    {
        for (int i = 0; i < 300; i++)
        {
            Thread.Sleep(0);
            Console.WriteLine("{0} ThreadProc: {1}, prio {2} ", Thread.CurrentThread.ManagedThreadId,
                i, Thread.CurrentThread.Priority);
        }
    }

    public static void Main()
    {
        Thread.CurrentThread.Priority = ThreadPriority.Normal;
        Thread t = new Thread(new ThreadStart(ThreadMethod));
        t.Priority = ThreadPriority.Highest;

        Thread t2 = new Thread(new ThreadStart(ThreadMethod));
        t2.Priority = ThreadPriority.Lowest;

        Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)1;

        t.Start();
        t2.Start();

        t2.Join();
        t.Join();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是模拟单核CPU,据我所知这里应该只执行主要具有最高优先级的线程,但我看到:低prio线程不断更改高prio每个操作 交换线程

线程互相改变.(当然在开始和结束时有不同的情况,但最高线程应该总是得到更多的时间片)

为什么这一直不是这样的?低prio线程必须执行较少的时间 首先是高优先级线程

Evk*_*Evk 5

你有2个线程:( t高优先级)和t2(低优先级),还有主线程.当高优先级线程执行时Thread.Sleep(0)- 它可以给它的时间片的唯一其他线程是t2,因为即使它具有较低的优先级 - 也没有其他选项.主线程被阻塞Join()并且没有代码可以运行,它不需要时间片.

要查看您期望的行为 - 再添加一个具有高优先级的线程:

public static void Main() {
    Thread.CurrentThread.Priority = ThreadPriority.Normal;
    Thread t = new Thread(new ThreadStart(ThreadMethod));
    t.Priority = ThreadPriority.Highest;

    Thread t2 = new Thread(new ThreadStart(ThreadMethod));
    t2.Priority = ThreadPriority.Lowest;

    Thread t3 = new Thread(new ThreadStart(ThreadMethod));
    t3.Priority = ThreadPriority.Highest;

    Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1;

    t.Start();
    t2.Start();
    t3.Start();
    t3.Join();
    t2.Join();
    t.Join();
}
Run Code Online (Sandbox Code Playgroud)

然后你会看到高优先级线程给彼此分配时间片,所以它们几乎都只执行它们的循环,并且只有在它们完成之后 - 低优先级线程才会执行它的循环.