| Многопоточность: получилось-5 (15.10.2025). |
|
| 2025 - Октябрь | |||
| 15.10.2025 17:04 | |||
Использовалась Visual Studio 2017 года вместо 2022. Не стояла цель переписать многопоточную программу на Borland C++ Builder - многопоточно в этой среде: экспресс-тестирование, т.к. даже печатать уже становится больно. Успешно были созданы потоки (как в режиме многопоточности, так и в режиме параллельных вычислений) - стали понятны закономерности: - аналог неработающей WaitFor от билдера - работающая Join: ждать, пока поток закончит работу; - мьютексы сильно замедляют работу при параллелизме (хоть и работают корректно: lock и unlock). Настолько, что критические секции даже проверять не стали, - они, однозначно, быстрее мьютексов; - конструкция мьютекса "lock_guard<mutex>" - убивает параллелизм, заставляя выполнять потоки последовательно (просто на разных ядрах); - остался неясен вопрос, что быстрее в функции потока: блокировка самих данных в цикле - или всего цикла с данными; - объект потока создаётся, привязываясь к конкретной функции в первом входном параметре, - очень удобно. Есть другие входные параметры: в тестовом проекте разработчик добавил вторым произвольный класс, а третьим - число. И это число - является входным параметром в функции. Такой способ передачи данных в поток был недоступен как в Qt, так и в билдере - чувствуется дополнительное преимущество: меньше обращений к глобальным переменным, создавая их копию для потока (по RAM, наверно, при больших объёмах данных - будут жуткие системные требования). Загрузка логических процессоров (реальных потоков ЦП) показала: - родительский поток, когда выполняет Join запущенных дочерних потоков: в Join точно есть какой-то аналог while (true) - ядро в "ожидании завершения" загружено процентов на 56; - 3 дочерних ядра грузятся на процентов 70 - что является результатом лучшим, чем у билдера. Однако и исходный код другой, и 12 ядер надо было грузить вместо 3; - какого-то хрена, грузился дополнительно один из логических процессоров - таким же графиком, как и родительский поток. Надо изучить подробнее и мьютексы и секции, реализовав часть кода из программы билдера. Но - #скоро или #никогда. (добавлено 26.05.2026) Обобщая все материалы по многопоточности, включая этот: первый, второй, третий, четвёртый, пятый. Результат: переписана однопоточная программа расчёта простых чисел на Visual Basic v.6.0, став многопоточной на Borland C++ Builder v.6.0 (размещена вместе с исходниками). Последний работает с потоками хорошо (прирост скорости составил 3 с лишним раза вместо теоретических 11 - тоже неплохо), но остался возможно именно его баг: родительский поток тормозит дочерние, когда в нём while (true) крутится. Написал визуальный механизм слежения за потоками (замедляющий работу раз в 10, но не в этом суть: слежение за работой потоков через средства ОС - дезинформирует). Да, если простые числа анализируются в числах-квадриллионах - видно: все потоки закончили работу с непростыми числами и тупо ждут, пока 1-3 потока закончат анализ чисел простых. Но при меньших значениях данная разница несущественна - точно родительский поток тормозит дочерние. И никакая оптимизация кода в родительском потоке это не исправила. |
|||
| Обновлено ( 26.05.2026 10:49 ) |