0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 24
|
|
1 | |
CreateThread перестаёт создавать потоки (видимо утечка ресурсов, но вот где?)03.11.2015, 20:15. Показов 1372. Ответов 10
Метки нет (Все метки)
Собственно есть программа которая занимается расчётами.
Создаёт по 8 потоков для каждой итерации расчётов (итерация завершается тогда, когда функция каждого из потоков вернёт значение, то есть каждый из потоков закроется (не совсем уверен в правомочности последнего высказывания)). где-то после создания ~140 000 потоков наша программа начинает создавать не 8 потоков, а меньшее их число. Память растёт (но за 2гига не переползает (~проблемы на 400мб) (32 разрядная ось)). Программа реализована под билдером -- CodeGuard молчит как партизан. В общем очевидно что что-то текёт но уже поздно и я нифига не соображаю, и разбираться в теме самостоятельно мне сейчас кажется не продуктивным занятием -- может ли кто-нибудь указать как именно следует закрывать потоки чтобы ничего не текло? (Я понимаю что создание 8 потоков однократно, с последующей разморозкой их с меняющимся контекстом решило бы проблему, но хотелось бы понять в чём именно проблемма заключается, что это вообще за потеря и чего? и собственно почему потоки продолжают создаваться, но при создании их подряд, несколько последних не создаётся? и вот ещё важный вопрос, что-то я проглядел, или нигде нет информации в каких случаях возвращается false при вызове CreateThread???) Тем кто может что-то полезное написать по теме (текст или ссылки) заранее большая благодарность.
0
|
03.11.2015, 20:15 | |
Ответы с готовыми решениями:
10
Где создавать потоки для выполнения метода класса? Wildfly (JBoss) где и как создавать папку для ресурсов? Canvas утечка ресурсов Утечка GDI ресурсов |
Ушел с форума
|
|
03.11.2015, 20:24 | 2 |
Сообщение было отмечено kostia_ff как решение
Решение
Каждый поток резервирует 1 МБ стека, плюс определенные затраты
на thread local storage, если он используется, на внутренние структуры и т.п. 140000 потоков - это сумасшествие. Дать потоку сигнал, чтобы он сам завершился (т.е. покинул функцию потока). После этого закрыть его хэндл. Ресурсов не хватает, очевидно же. Ну например, в памяти недостаточно места, чтобы зарезервировать область под стек или другие структуры. Вот CreateThread и обламывается.
1
|
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 24
|
|
03.11.2015, 20:51 [ТС] | 3 |
Ну одновременно работает максимум 8 потоков, а 140к -- это общее число созданных и уже завершённых.
Большое спасибо за CloseHandle -- думаю это именно то что было упущено из виду. И вот ещё вопрос -- есть ли принципиальные различия между созданием потока каждый раз когда нужно, и однократным созданием некоторого колличества потоков с заморозкой/разморозкой по мере надобности? (то есть потери в производительности за счёт времени необходимого на создание потоков не существенны. Нужно ли переписать код через заморозку/разморозку потоков, или просто закрывать хендлы созданных потоков и больше не вспоминать про этот проект?)
0
|
Ушел с форума
|
|
03.11.2015, 21:03 | 4 |
1
|
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 24
|
|
04.11.2015, 07:20 [ТС] | 5 |
Спасибо Убеждённый.
Необходимо протестировать систему, и это не быстро. Через несколько дней надеюсь будут результаты и я отпишусь о них.
0
|
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 24
|
|
09.11.2015, 08:33 [ТС] | 6 |
В общем ситуация такая: заморозка/разморозка потоков работает хорошо.
А вот с CloseHandle не всё так гладко: при создании тестового проекта под Билдером (создание m потоков, возврат числа, проверка GetExitCodeThread - завершился/незавершился, и вызов CloseHandle если завершился), появилась утечка.
0
|
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
|
|
11.11.2015, 19:29 | 7 |
kostia_ff, добавлю кстати, может пригодится. Как сказал убежденный по дефолту под стек зарезервировано 1Mb, но можно уменьшить это число тем самым уменьшить потребляемые ресурсы (второй параметр у CreateThread). Подробней тут. На windows 2000 правда меньше 1Mb не сделать, ну а выше можно.
0
|
2 / 2 / 1
Регистрация: 09.10.2016
Сообщений: 29
|
|
15.11.2016, 18:22 | 8 |
Используй лучше _beginthread.
0
|
Ушел с форума
|
|
15.11.2016, 18:37 | 9 |
Тогда уж лучше _beginthreadex.
0
|
2 / 2 / 1
Регистрация: 09.10.2016
Сообщений: 29
|
|
16.11.2016, 18:51 | 10 |
_beginthreadex принимает атрибуты, которые могут быть не нужны программисту (в моём случае, например)
0
|
Ушел с форума
|
|
16.11.2016, 19:02 | 11 |
У _beginthread (без 'ex') есть один серьезный недостаток:
А лишние аргументы - не проблема, для этого есть врапперы.
1
|
16.11.2016, 19:02 | |
16.11.2016, 19:02 | |
Помогаю со студенческими работами здесь
11
Не растягивается бекграунд - где-то намудрила с классами и идентификаторами видимо Как правильно создавать потоки? Где то есть ошибка, а вот где она? Где может быть утечка? Где утечка памяти(много кода) Где утечка памяти в цикле с TIdHTTP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |