Лучший совет, вероятно, "старайтесь избегать глобалов". Людям не нужны глобальные переменные так часто, как они думают. Обычно оказывается, что «передать все в качестве аргументов конструкторам» не так много работы, как люди думают, когда слышат предложение. Это также приводит к более чистому коду с меньшим количеством и более явными зависимостями.
Мне неизвестен какой-либо «правильный» способ объявления глобалов в C ++. То, как вы это делаете, теперь работает нормально, но порядок инициализации не определен, поэтому, если есть какие-либо зависимости между вашими глобальными переменными, у вас проблемы.
Функция, возвращающая статический экземпляр, более или менее решает эту проблему, но не является поточно-ориентированной.
А синглтон - это просто ужасная идея. Это не решает вашу проблему, но добавляет дополнительные ограничения в ваш код, которые на самом деле не были необходимы, и, скорее всего, вернутся и укусят вас позже.