Здравствуйте, Кодт, Вы писали:
К>Тут, скорее, речь вот о чём.
К>Главный поток (который main() ± конструкторы-деструкторы-exit-функции) — это тоже поток.
Ну если в этом смысле, то хорошо.
Я уже начал думать, что нельзя иметь синглтон с потоком и с его завершением в деструкторе не только в DLL, но и в С++...
К>И его завершение происходит в таком порядке:
К>- вышли из main
К>- выполнили деструкторы TLS-объектов
К>- выполнили деструкторы SS-объектов, инициализированных по требованию
К>- выполнили деструкторы SS-объектов
Последнее и предпоследнее не может вперемешку выполнятся?
Вроде реализации не разделяют:
http://ideone.com/yq6NJr
#include <iostream>
#include <string>
using namespace std;
int g_tab = 1;
struct X {
int tab;
const char* name;
X(const char* name) : name(name), tab(g_tab++) {
cout << string(tab, '\t') << name << " : ctor" << endl;
}
~X() {
cout << string(tab, '\t') << name << " : dtor" << endl; }
};
struct Y {
Y() {
static X s2("s2");
}
};
Y y;
X g1("g1");
X g2("g2");
int main() {
cout << "start!" << endl;
static X s1("s1");
cout << "finish!" << endl;
}
s2 : ctor
g1 : ctor
g2 : ctor
start!
s1 : ctor
finish!
s1 : dtor
g2 : dtor
g1 : dtor
s2 : dtor
К>// первое обращение к TLS провоцирует инициализацию всех TLS-объектов
А в MSVC сразу при старте потока (из TLS Callback). Это implementation-defined, или кто-то нарушает?