Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2014, 01:18   #11
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Так ведь guarded_thread - тоже объект, который будет уничтожаться. У него в деструкторе вызовется join, за счет этого программа и дождется завершения потока.

А в примере с fltk до уничтожения потока могли теоретически уничтожиться какие-то внутренние объекты fltk, без которых окно создаться не может.
Son Of Pain вне форума Ответить с цитированием
Старый 09.01.2014, 09:04   #12
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Думаю это ограничение самой оси, MessageBox тоже не может показаться
Код:
void thr_fn() {
    this_thread::sleep_for( chrono::seconds(3) );  // Ждем 3 секунды - можно успеть разрушить все глоб. объекты
    for(int i = 3;  i > 0;  -- i) {  
        cout << "tick\n";
        this_thread::sleep_for( chrono::seconds(1) );
    }
    MessageBoxA(NULL, "fsf", "dsf", MB_OK);
}

guarded_thread thr;

int main() {
    thr = guarded_thread {thr_fn};
    return 0;
}
1. Чем отличается поток в main() от порожденного? С точки зрения ОС (может он регистрируется какими-то спец функциями).
2. Можно ли наделить порожденный поток такими же правами как main поток?
220Volt вне форума Ответить с цитированием
Старый 09.01.2014, 12:07   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

1. Ничем
2. В смысле? Они ничем не отличаются, права у них одинаковые, если их не менять.

В вашем примере MessageBox не показывается, потому что после выхода из main() вызывается ExitProcess(). Это не ограничение OS, это имплементация данного С компилятора. Если не использовать ExitProcess, процесс завершится когда завершатся все его потоки.
waleri вне форума Ответить с цитированием
Старый 09.01.2014, 12:52   #14
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Все, я понял. Добавил к предыдущему коду еще один cpp модуль и в нем создавался глобальный объект:
Код:
struct FG
{
    FG() {std::cout <<"FG::constr\n";}
    ~FG(){std::cout << "FG::dest\n";}
}fg;
и получил такой вывод:
Код:
FG::constr
FG::dest
tick
tick
tick
Т.е. в пределах модуля глобальные объекты ждут завершение всех потоков модуля (возможно это не гарантировано), но о потоках из других модулей ничего не знают.
220Volt вне форума Ответить с цитированием
Старый 09.01.2014, 13:05   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Как только вы выйдете из main() все глобальные объекты будут удалены.
Никто никого не ждет, если только в самих деструкторах нет какой либо синхронизации.
waleri вне форума Ответить с цитированием
Старый 09.01.2014, 13:23   #16
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Я ведь делал join(). Вообще все работает логично. Просто я сузил взгляд до одного модуля и двух потоков. Ведь модулей может быть много и у них могут быть свои потоки в глобальных объектах. Единственным способом (на мой взгляд) контролировать начало разрушения глобальных объектов - контролировать момент завершения главного потока.
220Volt вне форума Ответить с цитированием
Старый 09.01.2014, 18:13   #17
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Мы тут немножко коснулись WinApi, у меня небольшой вопрос. Здесь http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx много говорится про ограничения входной точки ДЛЛ, также сказано что эти ограничения распространяются на конструкторы/деструкторы глобальных/статических объектов. У меня к сожалению нечем открыть предлогаемый там файл с примерами, поэтому хотел бы уточнить:
- Безопасно ли вызывать средства из С/C++ std библиотек в конструкторах/деструкторах глобальных объектов длл (динамически линкуемая std библиотека)?
220Volt вне форума Ответить с цитированием
Старый 09.01.2014, 21:14   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Распространяются только потому, что создание/удаление объктов делается из DllMain (из С рантайма, а не вашего). std библиотеки обычно вызывать безопасно, но зачем? ГЛобальные объекты - зло (строгое IMHO).
waleri вне форума Ответить с цитированием
Старый 09.01.2014, 21:55   #19
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Спасибо за ответы.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему при перегруженных = и +, вызывается... WebbMan Общие вопросы C/C++ 18 13.12.2012 01:15
Почему вызывается деструктор? MrGukk Общие вопросы C/C++ 13 23.08.2012 17:42
Не вызывается деструктор kineziz Общие вопросы C/C++ 4 18.08.2012 15:54
два раза к одной таблице Kolik317 SQL, базы данных 2 26.12.2009 13:58
слово пишется два раза INDY-SAVER Microsoft Office Word 2 18.11.2009 23:49