Изменение приоритета потока не влияет на порядок потока
Приоритету потока может быть назначено 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