#многопоточность #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
Комментариев нет:
Отправить комментарий