0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 24
1

CreateThread перестаёт создавать потоки (видимо утечка ресурсов, но вот где?)

03.11.2015, 20:15. Показов 1372. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно есть программа которая занимается расчётами.
Создаёт по 8 потоков для каждой итерации расчётов (итерация завершается тогда, когда функция каждого из потоков вернёт значение, то есть каждый из потоков закроется (не совсем уверен в правомочности последнего высказывания)).
где-то после создания ~140 000 потоков наша программа начинает создавать не 8 потоков, а меньшее их число.

Память растёт (но за 2гига не переползает (~проблемы на 400мб) (32 разрядная ось)). Программа реализована под билдером -- CodeGuard молчит как партизан.

В общем очевидно что что-то текёт но уже поздно и я нифига не соображаю, и разбираться в теме самостоятельно мне сейчас кажется не продуктивным занятием -- может ли кто-нибудь указать как именно следует закрывать потоки чтобы ничего не текло? (Я понимаю что создание 8 потоков однократно, с последующей разморозкой их с меняющимся контекстом решило бы проблему, но хотелось бы понять в чём именно проблемма заключается, что это вообще за потеря и чего? и собственно почему потоки продолжают создаваться, но при создании их подряд, несколько последних не создаётся? и вот ещё важный вопрос, что-то я проглядел, или нигде нет информации в каких случаях возвращается false при вызове CreateThread???)

Тем кто может что-то полезное написать по теме (текст или ссылки) заранее большая благодарность.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2015, 20:15
Ответы с готовыми решениями:

Где создавать потоки для выполнения метода класса?
Доброго времени суток! Не совсем владею материалом, (вернее, совсем не) поэтому могу написать...

Wildfly (JBoss) где и как создавать папку для ресурсов?
При загрузке сервера все данные сохраняются во временной папке wildfly/standalone/tmp/... которая...

Canvas утечка ресурсов
После вызова ф-ции: var imgData = canvas.toDataURL(); или отрисовки одного канваса в другой...

Утечка GDI ресурсов
Здравствуйте. Ресурсы GDI тратятся просто дикими темпами: после создания окна - 50, после первого...

10
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.11.2015, 20:24 2
Лучший ответ Сообщение было отмечено kostia_ff как решение

Решение

Каждый поток резервирует 1 МБ стека, плюс определенные затраты
на thread local storage, если он используется, на внутренние структуры и т.п.
140000 потоков - это сумасшествие.

Цитата Сообщение от kostia_ff Посмотреть сообщение
как именно следует закрывать потоки чтобы ничего не текло?
Дать потоку сигнал, чтобы он сам завершился (т.е. покинул функцию потока).
После этого закрыть его хэндл.

Цитата Сообщение от kostia_ff Посмотреть сообщение
и собственно почему потоки продолжают создаваться, но при создании их подряд, несколько последних не создаётся?
Ресурсов не хватает, очевидно же.

Цитата Сообщение от kostia_ff Посмотреть сообщение
и вот ещё важный вопрос, что-то я проглядел, или нигде нет информации в каких случаях возвращается false при вызове CreateThread?
Ну например, в памяти недостаточно места, чтобы зарезервировать область
под стек или другие структуры. Вот CreateThread и обламывается.
1
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 24
03.11.2015, 20:51  [ТС] 3
Ну одновременно работает максимум 8 потоков, а 140к -- это общее число созданных и уже завершённых.

Большое спасибо за CloseHandle -- думаю это именно то что было упущено из виду.

И вот ещё вопрос -- есть ли принципиальные различия между созданием потока каждый раз когда нужно, и однократным созданием некоторого колличества потоков с заморозкой/разморозкой по мере надобности? (то есть потери в производительности за счёт времени необходимого на создание потоков не существенны. Нужно ли переписать код через заморозку/разморозку потоков, или просто закрывать хендлы созданных потоков и больше не вспоминать про этот проект?)
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.11.2015, 21:03 4
Цитата Сообщение от kostia_ff Посмотреть сообщение
есть ли принципиальные различия между созданием потока каждый раз когда нужно, и однократным созданием некоторого колличества потоков с заморозкой/разморозкой по мере надобности?
Нет. Если только нет каких-то специфических требований.
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
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.11.2016, 18:37 9
Тогда уж лучше _beginthreadex.
0
2 / 2 / 1
Регистрация: 09.10.2016
Сообщений: 29
16.11.2016, 18:51 10
_beginthreadex принимает атрибуты, которые могут быть не нужны программисту (в моём случае, например)
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.11.2016, 19:02 11
Цитата Сообщение от null_0 Посмотреть сообщение
_beginthreadex принимает атрибуты, которые могут быть не нужны программисту
У _beginthread (без 'ex') есть один серьезный недостаток:
If the thread that's generated by _beginthread exits quickly, the handle that's
returned to the caller of _beginthread might be invalid or point to another thread.
Уже одного этого хватит, чтобы никогда не использовать данную функцию.
А лишние аргументы - не проблема, для этого есть врапперы.
1
16.11.2016, 19:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2016, 19:02
Помогаю со студенческими работами здесь

Не растягивается бекграунд - где-то намудрила с классами и идентификаторами видимо
Посмотрите, пожалуйста, почему фон не становиться на все окно браузера. <body> <div...

Как правильно создавать потоки?
Ребята, подскажите как правильно организовать работу функции в отдельном потоке, чтобы она не...

Где то есть ошибка, а вот где она?
Есть такой код, замудрённый конечно, но, как умею уж: private void button4_Click(object sender,...

Где может быть утечка?
begin flag := true; while flag do begin bmp := TBitmap.Create; bmp.Width :=...

Где утечка памяти(много кода)
Всем привет. Довольно давно я писал одну примитивную игру, в попытках более лучше освоить Qt. Игра...

Где утечка памяти в цикле с TIdHTTP
Обычный граббер. При работе постепенно медленно растёт объём занимаемой оперативной памяти. Спустя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru