Вы не видите никакой разницы, потому что вы, вероятно, запускаете эту программу на многопроцессорной машине, где нити не должны конкурировать друг с другом, чтобы планироваться на одном ядре.
При выполнении потока с высоким приоритетом планировщик может по-прежнему планировать поток с низким приоритетом на другие ядра, поэтому вы не видите существенной разницы.
Если вы хотите заметить существенную разницу, вы должны заставить потоки конкурировать за временной срез против одного ядра, где может выполняться только один поток за раз. Чтобы достичь этого, вы должны установить близость процессора для всех потоков к одному и тому же ядру.
Я не знаю, как вы можете сделать это в .NET, но в C следует использовать SetThreadAffinityMask
функцию:
HANDLE hThreadLow = CreateThread(NULL, 0, ThreadProc1,
NULL, CREATE_SUSPENDED, &dwThreadLowId);
HANDLE hThreadHigh = CreateThread(NULL, 0, ThreadProc2,
NULL, CREATE_SUSPENDED, &dwThreadHighId);
SetThreadPriority(hThreadLow, THREAD_PRIORITY_BELOW_NORMAL);
SetThreadPriority(hThreadHigh, THREAD_PRIORITY_ABOVE_NORMAL);
SetThreadAffinityMask(hThreadHigh, 0x00000001);
SetThreadAffinityMask(hThreadLow, 0x00000001);
ResumeThread(hThreadLow);
ResumeThread(hThreadHigh);
Теперь вы заметите существенную разницу между этими двумя потоками. Внедрите счетчик в каждом из двух потоков и увидите разницу в диапазоне от 100x10000x в подсчитанных значениях.
Чтобы "дать остальную часть моего кванта времени для выполнения другого потока" Я хотел бы предложить Sleep (0) вместо сна (1). – ChrisW
Это распространенное заблуждение, но Sleep (1) - это то, что вы хотите. Sleep (0) дает исполнение только для потоков с одинаковым приоритетом. Sleep (1) приведет к любому потоку, доступному для исполнения. Вот хороший блог на эту тему: http://www.bluebytesoftware.com/blog/PermaLink,guid,1c013d42-c983-4102-9233-ca54b8f3d1a1.aspx Я думал, что Sleep (0) был верным в течение многих лет, но я был неправильно. –
Спасибо. (от 15 до 15 символов) – ChrisW