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