Изменение приоритета потока не влияет на порядок потока

Приоритету потока может быть назначено 5 различных уровней приоритета, и предполагается, что поток с приоритетом выше нормального имеет приоритет над потоком с приоритетом ниже нормального. Однако он не работает даже в примере с Microsoft ( https://msdn.microsoft.com/en-us/library/system.threading.thread.priority(v=vs.110).aspx). Результаты меняются очень быстро. Чтобы быть очень конкретным, иногда число абовенормальных является самым высоким, а иногда число ниже нормальных является самым высоким, я не мог понять, почему?

Вот код из документов Microsoft.

{    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    using Timers = System.Timers;

    namespace ConsoleApp1
    {            
        class Test
        {
            static void Main()
            {
                PriorityTest priorityTest = new PriorityTest();

                Thread thread1 = new Thread(priorityTest.ThreadMethod);
                thread1.Name = "ThreadOne";
                Thread thread2 = new Thread(priorityTest.ThreadMethod);
                thread2.Name = "ThreadTwo";
                thread2.Priority = ThreadPriority.BelowNormal;
                Thread thread3 = new Thread(priorityTest.ThreadMethod);
                thread3.Name = "ThreadThree";
                thread3.Priority = ThreadPriority.AboveNormal;

                thread1.Start();
                thread2.Start();
                thread3.Start();
                // Allow counting for 10 seconds.
                Thread.Sleep(10000);
                priorityTest.LoopSwitch = false;
            }
        }

        class PriorityTest
        {
            static bool loopSwitch;
            [ThreadStatic] static long threadCount = 0;

            public PriorityTest()
            {
                loopSwitch = true;
            }        
            public bool LoopSwitch
            {
                set { loopSwitch = value; }
            }        
            public void ThreadMethod()
            {
                while (loopSwitch)
                {
                    threadCount++;
                }
                Console.WriteLine("{0,-11} with {1,11} priority " +
                    "has a count = {2,13}", Thread.CurrentThread.Name,
                    Thread.CurrentThread.Priority.ToString(),
                    threadCount.ToString("N0"));
                Console.ReadKey();
            }
        }
    }   
}

1 ответ

Решение

Результаты, скорее всего, смещены, поскольку на вашем компьютере установлено несколько процессоров. Следовательно, все потоки могут быть запланированы на все время выполнения, и приоритет не влияет.

Например, на моем компьютере (8 ядер) результат:

ThreadThree с приоритетом AboveNormal имеет число = 946 357 287

ThreadTwo с приоритетом BelowNormal имеет число = 949,074,221

ThreadOne с нормальным приоритетом имеет число = 946 164 189

Это замечательно близко.

Теперь, если я изменю сродство в диспетчере задач для процесса и прикреплю приложение к одному ядру, потоки должны будут бороться за процессор, и теперь приоритет имеет огромное значение:

ThreadThree с приоритетом AboveNormal имеет число = 1,541,675,169

ThreadOne с обычным приоритетом имеет число = 584 725 723

ThreadTwo с приоритетом BelowNormal имеет число = 12 621 280

Другие вопросы по тегам