Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли ждать завершения потока в деструкторе класса?  (Прочитано 7949 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 20-03-2011 20:07 » 

Корректным ли это будет?

Код:
Application::~Application()
{
      WaitForSingleObject(hThread,  INFINITE);
      CloseHandle(hThread);
}

int WINAPI WinMain(...)
{
    Application a;
    a.run();        //будет запущен поток
    return 0;
}
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-03-2011 21:39 » 

The Nameless One, по-моему это вообще дико.

Где выделяешь память - там и освобождаешь.
Где открываешь файл - там и закрываешь.
Где делаешь fork - там же и делаешь join.

Если ты запустил поток внутри run, то и жди внутри run - все вопросы отпадут сами собой.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 20-03-2011 21:54 » 

Dimka, мне честно говоря тоже так показалось...
а потом я подумал - это же новая нить?
допустим я ее запустил - она работает, и мне надо какие то другие действия делать, не связанные с классом Application. Например еще десять нитей запустить.
тогда получается либо надо процедуру ожидания в открытые члены класса выводить, либо так.
более того, у такого, дикого с первого взгляда, подхода есть плюсы:
1. если размещение статическое, то winmain(абстрагируясь от того что это winmain) никогда не выйдет пока не дождется завершения нити.
а вот если динамическое - то... тогда непонятно.
впрочем я не агитирую. моя первая мысль тоже была о том что это дикость)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 21-03-2011 05:15 » 

Это вполне нормально, если поток создаётся методами класса и объект хранящий поток это класс, то при разрешении он обязан вернуть всё как было. Главное делать не просто join, а проверять перед этим запускался или поток и не сдох ли он.

ИМХО, не вижу в этом ничего страшного.

Что же касается где созадал и там и удалил, то создал ты его методом класса, разрушил методом класса, паритет сохраняется, опять же всякие умные указатели и хранители придумали именно для того, чтобы точки создания и удалиения разнести в пространстве и приэтом не забыть всё почистить.
Записан

Странно всё это....
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 21-03-2011 17:24 » 

Спасибо!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 21-03-2011 20:53 » 

Что так можно написать - никто и не спорит. Можно и ногами уши чесать - тоже при должной ловкости не проблема.

И всё это не отменяет того факта, что интерфейс класса Application получается диким. А в языках со сборщиком мусора это вообще имеет риск привести либо к утечке памяти, либо к параличу сборщика.

Мне даже слегка понятна ситуация, когда деструктор принудительно завершает работу потока. Но совершенно непонятна ситуация, когда он ждёт и, быть может, зависает.

И всё из-за того, что вызов деструктора может происходить неявно - т.е. внимание программиста на этом событии не концентрируется. Я уже не говорю о ситуациях с копированием объекта и уничтожением локальных копий, когда всякая "помирающая" локальная копия будет норовить зависнуть в ожидании.

Ещё раз: если в интерфейсе есть метод запуска, должен быть и зеркальный метод остановки. И никаких "побочных эффектов". На досуге можно почитать "Совершенный код" Макконнелла.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 21-03-2011 21:49 » new

Dimka,
забыл уточнить, что класс Application - singletone.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines