Это полностью зависит от того, что вам нужно сделать.Нет общего отвращения к использованию статики.Обратите внимание, что статика по сути является одноэлементным шаблоном, поэтому применяются все плюсы / минусы синглетонов.
С точки зрения потоков вы должны обратить внимание, поскольку один и тот же экземпляр может быть доступен для нескольких потоков одновременно.Если вам нужно только прочитать данные, то у вас не должно быть никаких проблем.Если вам нужно изменить данные, вам нужно беспокоиться о синхронизации.
Для повторного использования кода и тестирования одиночные кнопки часто могут создавать проблемы.Например, вы не можете воссоздать объект в тесте или выполнить несколько прогонов параллельно.В целом, когда я использую синглтоны / статику, я стараюсь обеспечить, чтобы один экземпляр всей жизни всех тестов, параллельных выполнений и т. Д. Был полностью в порядке.
Невидимая статика, как вы их называете(видимый только для модуля компиляции) - это хорошая идея.Это поможет вам поддерживать синхронизацию между потоками и правильно управлять ими.Если они имеют глобальную видимость, они могут быть изменены в любое время (хорошо, частные переменные не могут, поэтому они также хороши).
Также обратите внимание, что атомные переменные можно безопасно читать / записывать из различныхпотоки.Для простых счетчиков это часто хорошее решение: использование атомарного приращения.В C ++ 0x вы можете использовать «атомарный», предварительно используйте функцию ОС / компилятора, которая это делает.Как и в случае с одноэлементным шаблоном, вы можете легко спроектировать классы, в которых каждая функция синхронизируется, поэтому пользователю-одиночке не нужно об этом беспокоиться.Другими словами, статика не является поточно-ориентированной даже при написании.