Чтобы было ясно, на самом деле есть три проблемы с глобальными переменными в целом (не только со статистикой):
- Порядок инициализации Fiasco
- Порядок уничтожения Fiasco
- Многопоточность Несколько инициализаций
Конечно, в большинстве случаев уничтожение не является большой проблемой, но все же оно существует.
Новый C ++ 0xс поддержкой потоков, и, таким образом, есть некоторое преимущество (особенно для локальных статических переменных, связанных с многопоточностью).
С появлением C ++ 0x следующий код может пострадать только от "Разрушения"Закажите Fiasco "... если у вас нет циклической ссылки при инициализации курса.
// foo.h
class Foo
{
public:
static Foo& Instance() { static Foo M; return M; }
private:
Foo();
};
// bar.h
// idem for Bar
// foo.cpp
Foo::Foo() { Bar& bar = Bar::Instance(); .... }
Это прекрасно работает: поскольку экземпляр создается по требованию, язык гарантирует, что он будет там, когда вам это нужно,и с C ++ 0x гарантирует поведение, даже если несколько потоков пытаются получить доступ к функции одновременно.
Теперь, что из "Уничтожения Порядка Fiasco"?
Ну, объектыразрушаются в порядке, обратном их построению, поэтому, если вам нужен доступ к объекту в вашем деструкторе, доступ к нему в вашем конструкторе, просто чтобы убедиться, что он построен раньше вас, и все в порядке.
Конечно,без C ++ 0x все немного сложнее.Чтобы избежать многопоточной проблемы, единственный совет - сначала обращаться ко всем переменным, пока приложение все еще однопоточное (в основном).Таким образом, создаются все экземпляры, и больше нет проблем с параллелизмом.