|
|
|||||||||||
Оптимизировать ThreadPool на 8 потоков и задач02.05.2023, 21:06. Показов 3164. Ответов 55
Метки нет (Все метки)
Мое почтение, джентльмены.
Все работает, но хочу оптимизировать код, к примеру, для 8 потоков и задач. Слишком долго выполняется на малых объёмах вычислений, собственно поэтому и хочу реализовать ThreadPool. Из задуманного, удалить стек/очередь std::queue и операции std::move, tasks.pop(), tasks.emplace, возможно что-то еще. Я точно знаю. что буду запускать количество потоков и задач = std::thread::hardware_concurrency() (количеству логических ядер), поэтому очередь не нужна (будет фикс блок все время). Прошу поделится вашей реализацией или годным советом.
Добавлено через 8 минут В конструкторе своего класса
0
|
|||||||||||
| 02.05.2023, 21:06 | |
|
Ответы с готовыми решениями:
55
Ручное управление количеством потоков в ThreadPool Сканирование портов в несколько потоков с помощью ThreadPool Ограниченное количество одновременно работающих потоков без ThreadPool |
|
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
|
||
| 03.05.2023, 15:07 | ||
|
что качается сравнения parallel_launch и threadpool - вы не могли бы показать код как вы это запускаете и где делается замер времени?
0
|
||
|
|
||||||||
| 03.05.2023, 18:13 [ТС] | ||||||||
|
При закрытии приложения, вызывается деструктор моего класса, в котором вызывается деструктор thread_pool и на t.join() процесс зависает. В чем причина может быть, закрыт родительский поток? как можно побороть данную ошибку?
![]() Добавлено через 20 минут
0
|
||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 03.05.2023, 18:29 | |||
|
Добавлено через 12 минут Скорее всего конкурентный запуск parallel_launch виноват.
0
|
|||
|
|
|||
| 03.05.2023, 18:48 [ТС] | |||
|
std::jthread::request_stop - не помог.
Т.е. Ошибка возникает, когда ~thread_pool() вызывается при закрытии родительского приложения. При работающем родительском приложении ~thread_pool() отрабатывает нормально. И еще, поделитесь мнением, возможно с std::jthread будет проще реализовать такой же механизм?
0
|
|||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 03.05.2023, 18:56 | |||
|
2) А еслиб был, его вручную джойнить не пришлось бы.
0
|
|||
|
|
|
| 03.05.2023, 19:11 [ТС] | |
|
Это я заменил на jthread для решения проблемы, но не вышло. Сможете подсказать, как через стоп токен написать (еще не пользовался)?
thread_pool() я добавил в свой клас. В конструкторе своего класса я запускаю thread_pool() с нужным количеством потоков, в деструкторе своего класса ~thread_pool() . Мой класс, это один из классов в библиотеке СОМ.dll. COM.dll подключена, в данный момент к Excel. Через раннее связывание (кстати, нужно протестировать через позднее, на эту ошибку) Пока Excel открыт, в использовании моего класса и thread_pool() не возникает проблем. В VBA клас создаю, удаляю, в дебагере библиотеки вижу что все конструкторы и деструкторы этих классов (моего и thread_pool) отрабатывают штатно. При закрытии Excel, визуально окно закрывается, вызывается деструктор моего класса (отрабатывает штатно, если не вызывать деструктор thread_pool), а вот деструктор thread_pool зависает в цикле вектора потоков на первом же t.join();
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||
| 03.05.2023, 19:22 | ||||
|
0
|
||||
|
|
|
| 03.05.2023, 19:30 [ТС] | |
|
Возможно ли принудительно убить потоки, не используя t.join()? Все расчеты уже сделаны, ничего ждать и возвращать не нужно.
Если вызовы делаются в DllMain в ветке DLL_PROCESS_DETACH, здесь есть лекарство?
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||
| 03.05.2023, 19:35 | ||||
std::thread::naitive_handle. Но для начала попробуйте просто:
0
|
||||
|
|
|
| 03.05.2023, 19:51 [ТС] | |
|
Принципиально СОМ в данном случае не отличается от обычной dll. Есть разница в раннем или позднем связывании (что-то вроде, статистическте подключение и динамическое, но это влияет на конструкторы и деструкторы классов, помоему так, при раннем связывании конструктор и деструктор у меня срабатывает два раза (два экземпляра) при открытии Excel/закрытии и при использовании класса в vba, при позднем связывании надо проверить, но в теории один раз - при использовании класса в коде - динамическое подключение)
Добавлено через 14 минут "А в VBA нет концепции RAII?" - Нет. Можно руками создать объект и уничтожить, но никто этим не занимается. В конце процедуры (после щавершения) VBA сам их закроет.
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 03.05.2023, 19:52 | ||
|
Кстати, а если сделать глобальный пул потоков в dll (статический объект), а ваш класс пусть просто хранит ссылку на него (он же вам все равно только один нужен) что-то изменится?
0
|
||
|
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
|
|||||||
| 03.05.2023, 20:41 | |||||||
|
вы неправильно организовали завершение пула потоков. надо выставить флаг чтобы потоки его проверяли и сами завершались. при этом держать атОмный счётчик числа работающих потоков. вот псевдо код на С )
0
|
|||||||
|
|
|
| 03.05.2023, 20:47 [ТС] | |
|
В СОМ. dll так же нужно управлять ресурсами, она написана на С/С++.Это на VBA не нужно, но это пользователям, а не мне. Глобальный пул потоков идея неплохая, но ничем не отличается от пула в классе. Создавать и разрушать все равно надо и это приводит обратно к вопросу с возникающей ошибкой при закрытии Excel. Ну и плюс, в теории, если библа лежит в сети и подключается на разных ПК, у каждого ПК свое количество ядер, и тогда целесообразно в экземпляре класса создавать пул в зависимости от окружения.
0
|
|
| 03.05.2023, 21:03 | |
|
0
|
|
|
|
|
| 04.05.2023, 10:11 [ТС] | |
|
Отчет по ошибке:
1. Эта же ошибка возникает в ThreadPool (в топике), отчего возникает вопрос в локальности проблемы или не оптимальности кода и в ThreadPool 2. Замена t.join() на t.detach() - приводит к критической ошибке, приложение падает 3. Замена t.join() на TerminateThread(t.native_handle(), 0) - при закрытии приложения отрабатывает, но при вызове деструктора класса в VBA подвешивает приложение. 4. Замена t.join() на DWORD d = 0; GetExitCodeThread(t.native_handle(), &d); ExitThread(d); - закрывает приложение zayats80888, я заметил, что thread_pool создает на 1 поток меньше? к примеру, если ставим в деструктор 4 , создается 3 потока. 4й поток считается - это главный? может в этом причина? Может надо создавать 4 потока?
0
|
|
|
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
|
|
| 04.05.2023, 10:22 | |
|
у вас зависает потому что при вызове join главный поток ждёт завершения потока - а он у вас ждёт в condition.wait
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||
| 04.05.2023, 13:51 | ||||
|
Вот одна из возможных причин: https://learn.microsoft.com/en... ls/dllmain
1
|
||||
|
|
||
| 04.05.2023, 14:55 [ТС] | ||
|
Проблему решил: проблема была не в Excel. Excel в действительности и при раннем связывании и при позднем пользуется dll, только в сеансе выполнения кода VBA. А то, что я описывал выше (запускался конструктор при открытии Excel) - это открывалась другая надстройка, которая тоже использует СОМ. Дело было в ней. Если кратко создавался процесс через CoCreateInstance(), а убивался автоматом при закрытии Excel и соответственно надстройки - умным указателем CComPtr <IDispatch>. Я не стал копаться в процессах закрытия Excel, СОМ, надстройки и что происходит в это время с потоками, а просто сократил время жизни CComPtr до закрытия приложения. Спасибо за thread_pool, взял на вооружение.
0
|
||
|
|
|
| 12.05.2023, 16:32 [ТС] | |
|
zayats80888, есть ли у вас примеры простых parallel_launch, с использованием std::jthread и токенов? Возможно поделитесь информацией, где можно посмотреть, с разбором на пальцах? В гугле только поделки, не внушающие доверия или серьезные Thread Pool c несколькими очередями. Мне же нужен, очень простой пример и главное быстрый. Хочу понять, есть ли профит от С++20 в плане многопоточности и в сравнении с std::thread.
0
|
|
| 12.05.2023, 16:32 | |
|
ThreadPool и использование параллельных классов: распределение потоков по ядрам ЦП Обработка элементов в несколько потоков: ThreadPool или еще варианты? Смысл значений ThreadPool.SetMaxThreads и ThreadPool.SetMinThreads Как оптимизировать перемножние результатов массива задач? Алгоритм оптимального распараллеливания задач на несколько потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|
|
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы
### Аннотация
Представлено исследование по разработке агентной модели микоризной. . .
|
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики
Контекст
Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
|
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии
Введение
Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
|
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np
class PlantAgent:
def __init__(self, name, strategy, initial_biomass):
self. name = name
self. strategy = strategy # "greedy" (широколиственные) или. . .
|