задачу не делил, а просто прибавлял кол-во потоков. Для M=1,2,3,4 время выполнения практически одинаковое, для N=5 сразу заметно увеличивается. Для N=8 становится ровно в 2 раза больше.
И кстати у меня моя же программа но без деления задачи выдаёт весьма неожиданные результаты:
Код:
Times: 13.3s 16.2s 15.7s 15.8s 23.2s 23.7s 27.3s 30.8s 35.9s 39.7s
Неожиданные потому что не все потоки выполняются равномерно вперемешку, один-два занимают по 25% (целому ядру), а 50% делятся между остальными и соответственно не успевают завершиться все почти одновременно, хорошо видно как загрузка проца падает со 100% до 75%-50% в конце на несколько секунд. Плюс возрастание времени при переходе 7-8 потоков. Вот так винда распределяет процессорные ресурсы. Почему я и говорил что делить задачу надо на меньшие куски, чтобы гранулярность завершения потоков была поменьше. Ещё можно каждую секунду возвращать управление ОС из потока командой Sleep(1), но это может и не дать эффекта.
-- 04.01.2020, 15:18 --и понятно, что он заполняется, иначе как к нему обращаться?
Заполнять можно прямо в цикле for запускающем потоки (что плохо) или до начала этого цикла (что лучше). Влияние не особо сильное, намного менее секунды думаю, но всё же.