Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Поток с наименьшим приоритетом вызывается большее количество раз

#многопоточность #c_sharp


В следующем коде 5 потоков с разными приоритетами конкурируют за доступ к ЦП с 8
ядрами. Каждый поток увеличивает свой счетчик.
using System;
using System.Threading;

      class PriorityTesting 
     { 
       static long[] counts; 
       static bool finish;

       static void ThreadFunc(object iThread) 
       { 
         while(true) 
         { 
           if(finish) 
              break; 
           counts[(int)iThread]++; 
         } 
       }

       static void Main() 
       { 
         counts = new long[5]; 
         Thread[] t = new Thread[5]; 
         for(int i=0; i


Ответы

Ответ 1



Я думаю, всё очень просто: сигнал finish дошёл до потока с наименьшим приоритетом позже всех, из-за чего он поработал дольше всех. Вы добавьте ещё метрику - длительность работы потока. Разница на двух процессорной системе как раз из-за нехватки ресурсов. Я так понимаю, что приоритет начинает играть свою роль, когда происходит нехватка процессорных ресурсов, и в этом случае система начинает раздавать их в зависимости от приоритетов. Если же есть свободные ресурсы - то приоритеты не влияют.

Ответ 2



@Чад, а откуда появился сигнал finish? Это же просто переменная. Мне кажется, все проще. Потоки запускаются в цикле, в порядке повышения приоритета. Поэтому первый запущенный, при условии, что свободных ядер хватает, проработает дольше. А "сигнал" (на самом деле новое значение переменной) все потоки увидят одновременно. Я бы добавил переменную start, которой бы все потоки дожидались перед циклом с провевкой finish. while(!start); while(!finish) counts[(int)iThread]++; а в main for (...) // запуск потоков start = true;

Ответ 3



Thread with the lowest priority is invoked more times

Комментариев нет:

Отправить комментарий