Здравствуйте, Кодт, Вы писали:
К>А что касается shared_ptr<GlobalData>,
К>Если к нему обращаться в конструкторе и в той же единице трансляции, то компилятор просто обязан создать GlobalData (и зарегистрировать его в atexit) до выхода из конструктора ThreadData и, соответственно, до регистрации того в atexit.
Я не представляю, как это отработает, если мы созданим потоки до main, и первый, кому понадобился GlobalData — не основной поток.
К>Поэтому деструкторы всех ThreadData выполнятся до деструктора GlobalData. То есть, shared_ptr избыточен. К>Если запоминать shared_ptr как член при первом реальном обращении, — то нужно лишь обеспечить, что это первое реальное обращение не во время atexit. Либо делать синглетон-феникс.
Да, я ещё страхуюсь, что какой-то поток будет остановлен в atexit другого объекта, когда GlobalData уже уничтожен.
Логика такова, что в некоторых случаях после использования GlobalData в ThreadData нужен GlobalData в деструкторе ThreadData.
К>Однако, есть рацио в том, чтобы делать именно член — shared_ptr. Это если объекты раскиданы по разным единицам трансляции.
Ах, ну и да, ещё и поэтому, у меня это статики шаблонного класса, т.е. каждый в какой-то единице трансляции...