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

221
31 марта 2017, 22:01

Причем разница огромная, вплоть до 10 раз!

На 4-ехядерном процессоре нижеприведенная программа при низком проиритете процесса выполняется от 800 мс до 1600, в то время как при высоком - не было меньше 9 секунд

Как объяснить это неожидаемое поведение?

PS. Приоритет менял в диспетчере задач, проверял много раз в Release-конфигурации без VS, Windows 10

using System;
using System.Diagnostics;
using System.Threading;
namespace LoadTest
{
    class Test
    {
        const int n = 1000;
        static int count = 0;
        const int stepCount = 10;
        static AutoResetEvent are = new AutoResetEvent(false);
        static ManualResetEvent mre = new ManualResetEvent(false);
        static AutoResetEvent areEnd = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            while (true)
            {
                char action = Console.ReadKey().KeyChar;
                switch (action)
                {
                    case 't': Threads(); break;
                }
                are.Reset();
                mre.Reset();
                areEnd.Reset();
            }
        }
        static void Threads()
        {
            Thread[] ts = new Thread[n];
            for (int i = 0; i < n; i++)
            {
                ts[i] = new Thread(CPU);
                ts[i].Start();
            }
            are.WaitOne();//все потоки готовы
            var sw = Stopwatch.StartNew();
            mre.Set();//начать расчет
            areEnd.WaitOne();//расчет окончен
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
        }
        static void CPU(object i)
        {
            Interlocked.Increment(ref count);
            if (count == n) are.Set();//оповещаем что все потоки созданы
            mre.WaitOne();//ждем создания всех потоков
            Simple();
            Interlocked.Decrement(ref count);
            if (count == 0) areEnd.Set();//оповещаем о завершении всех потоков
        }
        static void Simple()
        {
            for (int j = 0; j < stepCount; j++)
                Console.WriteLine(j);
        }
    }
}
READ ALSO
Отправка COM-порт ASCII команд

Отправка COM-порт ASCII команд

Задача в опросе весов CAS AP через RS 232 или СОМ порт

444
сохранение jpg в наилучшем качестве C#

сохранение jpg в наилучшем качестве C#

Добрый деньИмеется код, объединяющий два изображения в одно:

239
WindowState = FormWindowState.Maximized;

WindowState = FormWindowState.Maximized;

Приложение написано с использованием WinFormsПри установке свойства:

306
PictureBox не отображает изображение visual c#

PictureBox не отображает изображение visual c#

Я новичок в c#, пишу небольшую игруЕё цель ставить звездочки так, чтобы их задело рандомно перемещающееся НЛО

310