Каждый файл, который содержит определение и использует его, будет пытаться инициализировать переменную. Даже если это происходит последовательно, а не одновременно, вам все равно нужен способ пометить переменную как инициализированную, так что только первое вхождение будет инициализировать ее, а последующие попытки инициализировать ее ничего не сделают.
Кроме того, вы можете создать несколько потоков до запуска main
. Конструкторы глобальных переменных (и функции, вызываемые этими конструкторами) могут порождать новые потоки.
Таким образом, вы можете иметь несколько фрагментов кода, все они выполняются до main
, все они пытаются инициализировать одну и ту же переменную. Вот для чего охранники.