Итак, во-первых, нет способа проверить, является ли какая-либо ссылка ссылкой на глобальный объект.По крайней мере, без некоторых жестких хаков для конкретной платформы (статическое сканирование памяти?), Которые могут не работать.Не иди по этой дороге.
Во-вторых (и это более важно) ваша проблема не является "глобальной".Это «общий».Почему вы думаете, что переменная должна быть глобальной, чтобы ее можно было использовать совместно?С другой стороны, могут быть глобальные переменные, которые не являются общими.Но в любом случае для этого также нет решения.Никакой хак вам здесь не поможет.
В-третьих, ваш средний код также не безопасен для потоков.Нет гарантии, что одиночная запись должна быть поточно-ориентированной.В некоторых случаях это (std :: cout), но нет такой гарантии для std :: ostream.Я могу легко написать свой собственный поток с записью без поточной защиты.
И последнее, но не менее важное: вы можете избежать всего этого, используя преимущества классов и мьютексов.Примерно так:
class Logger {
public:
Logger(std::ostream& stream): stream {stream}
{};
template<typename... Args>
void log(Args&&... args)
{
std::lock_guard<std::mutex> lg {mu};
(stream << ... << args);
}
private:
std::ostream& stream;
std::mutex mu;
};
и вообще не беспокойтесь обо всех нюансах безопасности потоков.
Для лучшего масштабирования вам может понадобиться взглянуть на некоторую очередь сообщений без блокировки,