Я использую CreateThread и TerminateThread для отмены потоков. Кажется, что пространство стека все еще выделено. Есть ли способ справиться с этим? Я не использую какие-либо вызовы динамической памяти, такие как malloc/new. Нити не должны изящно выйти. 10 нитей оставляют колоссальные 5 МБ памяти! Все потоки находятся в разных частях кода, так что есть простой способ реализовать систему межпроцессорной связи, которая может изящно сказать им, что все они будут закончены, и, следовательно, переориентировать стек?CreateThread, за которым следует TerminateThread, оставляет много памяти
ответ
В большинстве случаев вы должны не использовать TerminateThread()
. Если вы создаете новые потоки в своем приложении, вы несете ответственность за то, чтобы эти потоки выходили изящно. Когда вы используете TerminateThread()
, все виды ресурсов могут быть оставлены позади, потому что эта функция просто завершает поток без вызова функций очистки.
Что вы должны сделать, это использовать событие (или другие способы сигнализации), чтобы сказать ваши темы, что они должны закрыться. Когда поток внутренне принимает сообщение (событие сигнализируется или истекает срок ожидания и т. Д.), Функция потока может внутренне очищать и возвращать. Таким образом, вы выйдете из своих потоков правильно и не оставите беспорядок позади.
Событие без автоматического сброса и объекты WaitForMultipleObjects в вашем основном потоке будут делать то, что вы хотите. Если вы обнаружите, что более 64 одновременных рабочих потоков, вам придется переустановить, чтобы использовать другой подход, например, событие без автоматического сброса и семафор. Есть буквально десятки способов приблизиться к этой проблеме и множество примеров на форумах по всему Интернету, а также примеры MS в их распространении Visual Studio. Начните с этого.
Почему, по-вашему, существует необходимость в 'WaitForMultipleObjects'? – MSalters
Просто установка события выключения и выход из основного потока прекрасны, если вы не хотите знать, что они на самом деле все вниз. Если вам нужно знать, что все они опущены, то установка события и ожидание того, что все ручки потока будут сигнализированы (т. Е. Завершение), лучше всего использовать с использованием WFMO. Зачем кому-то это делать? Может быть огромный список причин. – WhozCraig
- 1. Предложение WHERE, за которым следует JOIN
- 2. Отображение UITableView, за которым следует изображение, за которым следует больше UITableViewCells
- 3. присваивание, за которым следует логический операнд
- 4. получить параметр URL, за которым следует # -php
- 5. llegal escape-символ, за которым следует пробел
- 6. номер, за которым следует капитал L
- 7. Соответствующий текст, за которым следует необязательный шаблон
- 8. Android IPC: onServiceConnected, за которым следует NullPointerException
- 9. Смещение ActiveRecord, за которым следует среднее значение
- 10. FileTransfer «Сохраненный файл:», за которым следует FileNotFoundException
- 11. - это сокет(), за которым всегда следует bind()?
- 12. Матч «:)» смайлик, за которым следует граница слова
- 13. PHP Условный, за которым следует Закрывающий тег
- 14. return statement, за которым следует список инициализаторов
- 15. Помощь с компонентом URI, за которым следует #
- 16. Python subprocess.Popen(), за которым следует time.sleep
- 17. Double-hashtags, за которым следует синтаксис asterisk
- 18. extern, за которым следует строка literal
- 19. Заменить%, за которым следует число в строке
- 20. Цикл «За», за которым следует оператор «if» в цикле «за»
- 21. Ошибка параметра CreateThread
- 22. Что означает тип, за которым следует _t (underscore-t)?
- 23. Соответствие слову, за которым следует пробел, за которым следуют три номера в BASH
- 24. IMediaControl :: Run, за которым следует IMediaControl :: Stop, за которым следует IMeidaControl :: Run не включает некоторые встроенные камеры
- 25. ioread32, за которым следует iowrite32, не дающая того же значения
- 26. Generic GDI + Exception, за которым следует OutOfMemory Exception
- 27. Очистка потоков в DLL: _endthreadex() против TerminateThread()
- 28. Nodejs Запрос, за которым следует запрос - проблема синхронизации
- 29. строка соответствия regex, за которой следует любое слово, за которым следует строковая переменная
- 30. Строка совпадения, за которой следует любой символ, за которым следует число с плавающей запятой
Почему имеет значение 5 МБ? И вы уверены, что не косвенно используете * malloc: даже 'printf' может его использовать. И ваш вопрос зависит от ОС. –