Интересный вопрос.
Я написал пример программы, которая делает именно это. У него есть класс, который будет выполнять некоторую интенсивную работу процессора, а затем возвращаться. Я указываю общее количество потоков, которые я хочу запустить, и общее количество раз, когда я хочу, чтобы работа выполнялась. Затем программа будет поровну разделять работу между всеми потоками (если есть только один поток, она просто получает все) и запускает их все.
Я запустил это на одной виртуальной машине с процессами, так как больше не мог найти настоящий компьютер с одним процессором.
Запустить самостоятельно:
1 Thread 5000 Work Units - 50.4365sec
10 Threads 5000 Work Units - 49.7762sec
Похоже, это показывает, что на однопроцессорном ПК с большим количеством потоков, выполняющих интенсивную работу с процессором, Windows достаточно умна, чтобы не переключать их быстро на четвертое, и они занимают примерно одинаковое количество времени.
Бежать вместе (или как можно ближе к нажатию клавиши ввода одновременно):
1 Thread 5000 Work Units - 99.5112sec
10 Threads 5000 Work Units - 56.8777sec
Это суть вопроса. Когда вы запускаете 10 потоков + 1 поток, кажется, что все они запланированы одинаково. Каждый из 10 потоков занимал 1/10 дольше (потому что был запущен одиннадцатый поток), в то время как другой поток занимал почти вдвое больше времени (в действительности, он выполнял 1/10 своей работы за первые 56 секунд, а затем остальные 9 /). 10-е в следующие 43сек ... что примерно так).
Результат: планировщик Window работает на уровне потока, но не на уровне процесса. Если вы создаете много потоков, вы можете оставить другие процессы, которые были недостаточно умными, чтобы сделать много потоков высокими и сухими. Или просто сделайте это правильно и используйте пул потоков: -)
Если вы хотите попробовать это сами, вы можете найти мой код:
http://teeks99.com/ThreadWorkTest.zip