Re[6]: Поясните за деструкторы thread_local (3.6.3/1)
От: Alexander G Украина  
Дата: 16.03.17 17:38
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А что касается shared_ptr<GlobalData>,


К>Если к нему обращаться в конструкторе и в той же единице трансляции, то компилятор просто обязан создать GlobalData (и зарегистрировать его в atexit) до выхода из конструктора ThreadData и, соответственно, до регистрации того в atexit.


Я не представляю, как это отработает, если мы созданим потоки до main, и первый, кому понадобился GlobalData — не основной поток.

К>Поэтому деструкторы всех ThreadData выполнятся до деструктора GlobalData. То есть, shared_ptr избыточен.

К>Если запоминать shared_ptr как член при первом реальном обращении, — то нужно лишь обеспечить, что это первое реальное обращение не во время atexit. Либо делать синглетон-феникс.

Да, я ещё страхуюсь, что какой-то поток будет остановлен в atexit другого объекта, когда GlobalData уже уничтожен.
Логика такова, что в некоторых случаях после использования GlobalData в ThreadData нужен GlobalData в деструкторе ThreadData.

К>Однако, есть рацио в том, чтобы делать именно член — shared_ptr. Это если объекты раскиданы по разным единицам трансляции.


Ах, ну и да, ещё и поэтому, у меня это статики шаблонного класса, т.е. каждый в какой-то единице трансляции...
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.