|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|||||||||||
странная утечка в многопоточном коде31.01.2021, 04:46. Показов 2451. Ответов 12
Всем доброго времени суток, реализовал многопоточный вариант алгоритма quicksort с использованием пула потоков (чтобы он не создавал каждый проход рекурсией новый поток). Однако почему-то сам пул не умирает, причем даже в конце программы (кт кстати у меня завершается с кодом 0). То есть строка "DIE" в деструкторе пула не выводится, хотя пулом владеет умный shared_ptr, что еще больше вызывает у меня недоумение. Прошу помочь выяснить в чем же утечка! Заранее благодарю за помощь!
UPDATE: Проблема не в утечке и не в shared_ptr, почему-то такая перестановка работает:
Добавлено через 7 минут Хотя похоже сама идея с пулом потоков дурацкая, потому что с большими данными работает в разы хуже однопоточной. Нужно вероятно какой-то определенный минимальный размер подмассива для распараллеливания выставить, и в ином случае делать однопоточно
0
|
|||||||||||
| 31.01.2021, 04:46 | |
|
Ответы с готовыми решениями:
12
Помогите советом: странная утечка памяти, не могу найти причину Почему не работает инкремент в многопоточном коде? Ошибка в многопоточном коде (работа с массивом ArrayList) |
|
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
|
||||||||
| 31.01.2021, 04:55 | ||||||||
|
Добавлено через 1 минуту и вообще, зачем вам многопоточный вариант quicksort? уже есть std::sort с возможным распараллеливанием Добавлено через 1 минуту
1
|
||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 31.01.2021, 11:12 | |||
|
HamsterGamer, ваша основная функция потока безопасна по исключениям? Нет, но вы их не отлавливаете. Более того, вы их не отлавливаете в функциях задач, при том, что сами бросаете исключение.
Так же объясните, в чем смысл этого фрагмента: Ну и самое главное:
1
|
|||
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||
| 31.01.2021, 12:25 [ТС] | ||
|
zayats80888,
Про pivot согласен, переделаю алгоритм. Добавлено через 29 секунд AndryS1, у меня тоже иногда код ошибки. Там где-то ub и я не понимаю, оно про алгоритм или про пул :c
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||
| 31.01.2021, 13:01 | |||||
|
Т.е. функция потока никогда не завершится. И ещё:
1
|
|||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||||
| 31.01.2021, 13:16 | |||||||||
Добавлено через 3 минуты Добавлено через 1 минуту Вот здесь у меня есть реализация примерно такого же пула потоков https://www.cyberforum.ru/blog... g5939.html Добавлено через 3 минуты Ну и - с твоим пулом потоков накладных расходов будет много больше, чем выгоды от многопоточности. Т.е. твоя сортировка будет работать медленнее, чем в одном потоке.
1
|
|||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 31.01.2021, 13:24 | ||
|
0
|
||
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|||||||||||
| 31.01.2021, 14:58 [ТС] | |||||||||||
|
zayats80888, oleg-m1973, вот что исправил по вашим советам:
0
|
|||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 31.01.2021, 15:14 | |||||||
Ну и - вполне вероятно, что пул потоков работает нормально, а твоя сортировка тупо зацикливается
1
|
|||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 31.01.2021, 16:18 | |||
Сообщение было отмечено HamsterGamer как решение
РешениеДавайте начнём с управления жизни пулом потоков. По вашей задумке: current_task запустит деструктор пула. Далее в деструкторе он попытается присоединить сам себя(это же один из потоков пула). Но даже если вы это учтёте, то после уничтожения пула, функция этого потока не завершиться, а пойдет на новую итерацию, где попытается заблокировать несуществующий mutex и т.д. Что бы этого избежать, в самом простом случае, функции потока нужно владеть неким разделяемым состоянием(флагом, который не будет уничтожен при уничтожении пула, например), что бы узнать, что пул уже уничтожен.Но лучше доверить это дело главному потоку, тем более, что и ему нужно знать, что задачи выполнены и можно использовать результат.
2
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 31.01.2021, 16:22 | ||
|
1
|
||
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||||||
| 31.01.2021, 16:31 [ТС] | ||||||
|
oleg-m1973, zayats80888, ок понял. Я не мог понять как это он сам себя пытается уничтожить, а сейчас мне стало ясно что деструктор последнего shared_ptr будет вызываться непосредственно в таске одного из потоков. Не знаю насколько это очевидная ошибка, но я как-то ее один вообще не заметил. Большое спасибо!
В моих ожиданиях пул должен был валидно помереть и повернуть статический флажок на false (is_alive), я это сделал для того чтобы его время работы измерить. По другому я не знаю как поймать завершение выполнения всех потоков в такой рекурсии. Хотя наверное сделать что-то типо этого (но в таком случае это уже не простой quick_sort, а суп какой-то, где помимо контейнера нужно еще и пул делать):
0
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 31.01.2021, 16:45 | |||||||
Сообщение было отмечено HamsterGamer как решение
Решение
Но только это тоже будет работать дико медленно. Чтобы работало хотя бы также, как параллельный std::sort, нужно чтобы в твоей функции сортировки не запускалось никаких потоков и не выделялось никакой динамической памяти.
1
|
|||||||
| 31.01.2021, 16:45 | |
|
Помогаю со студенческими работами здесь
13
Будет ли утечка в таком коде Возможна ли утечка памяти в следующем коде
Странная строчка в коде Странная ошибка в коде Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|