Добрый день.
Не знаю как правильно синхронизировать потоки. Выполняю математические расчеты. Нужно использовать все ядра процессора и после каждого полного прохода выводить результат на экран, после вывода на экран нужно сразу же начинать новый проход и тд. И при этом нужна максимальная производительность. Процедура распределения задачи на разное количество ядер есть. Но не получается совместить синхронизацию с максимальной производительностью.
Сама задача - расчёт столкновений шариков в двумерном пространстве. Цель - макс количество кадров в секунду.
Делал разными способами, но каждый раз получается не то, что нужно.
Если в качестве синхронизации использовать TThread.OnTerminate, где по счетчику определять все ли потоки завершены и потом уже выводить на экран и создавать потоки заново, то получается очень медленно. 2 ядра дают 10% преимущества перед 1 ядром. Наверно потому что много времени уходит на создание потоков и ожидание выполнения всех.
Если каждый поток выполнять бесконечным циклом, не давая ему завершиться и в конце итерации осуществлять вывод на экран, то получается максимально быстро но вместо одного вывода на экран число выводов равно числу потоков и невозможно правильно отследить частоту кадров. И получается рассинхронизация потоков.
И много промежуточных вариантов пробовал тоже.
Как правильно нужно организовать взаимодействия потоков, чтобы была максимальная производительность?