2012-09-03 2 views
0

Я использую CreateThread и TerminateThread для отмены потоков. Кажется, что пространство стека все еще выделено. Есть ли способ справиться с этим? Я не использую какие-либо вызовы динамической памяти, такие как malloc/new. Нити не должны изящно выйти. 10 нитей оставляют колоссальные 5 МБ памяти! Все потоки находятся в разных частях кода, так что есть простой способ реализовать систему межпроцессорной связи, которая может изящно сказать им, что все они будут закончены, и, следовательно, переориентировать стек?CreateThread, за которым следует TerminateThread, оставляет много памяти

+1

Почему имеет значение 5 МБ? И вы уверены, что не косвенно используете * malloc: даже 'printf' может его использовать. И ваш вопрос зависит от ОС. –

ответ

11

В большинстве случаев вы должны не использовать TerminateThread(). Если вы создаете новые потоки в своем приложении, вы несете ответственность за то, чтобы эти потоки выходили изящно. Когда вы используете TerminateThread(), все виды ресурсов могут быть оставлены позади, потому что эта функция просто завершает поток без вызова функций очистки.

TerminateThread documentation

Что вы должны сделать, это использовать событие (или другие способы сигнализации), чтобы сказать ваши темы, что они должны закрыться. Когда поток внутренне принимает сообщение (событие сигнализируется или истекает срок ожидания и т. Д.), Функция потока может внутренне очищать и возвращать. Таким образом, вы выйдете из своих потоков правильно и не оставите беспорядок позади.

3

Событие без автоматического сброса и объекты WaitForMultipleObjects в вашем основном потоке будут делать то, что вы хотите. Если вы обнаружите, что более 64 одновременных рабочих потоков, вам придется переустановить, чтобы использовать другой подход, например, событие без автоматического сброса и семафор. Есть буквально десятки способов приблизиться к этой проблеме и множество примеров на форумах по всему Интернету, а также примеры MS в их распространении Visual Studio. Начните с этого.

+0

Почему, по-вашему, существует необходимость в 'WaitForMultipleObjects'? – MSalters

+0

Просто установка события выключения и выход из основного потока прекрасны, если вы не хотите знать, что они на самом деле все вниз. Если вам нужно знать, что все они опущены, то установка события и ожидание того, что все ручки потока будут сигнализированы (т. Е. Завершение), лучше всего использовать с использованием WFMO. Зачем кому-то это делать? Может быть огромный список причин. – WhozCraig

Смежные вопросы