Проблема возникает, когда вы читаете это состояние назад и что-то с этим делаете. Запись - это красная сельдь - это правда, что, пока это одно слово, большинство сред гарантируют, что запись будет атомарной, но это не означает, что больший кусок кода, включающий этот фрагмент, является поточно-ориентированным. Во-первых, предположительно, ваша глобальная переменная содержала для начала другое значение - иначе, если вы знаете, что она всегда одна и та же, почему она является переменной? Во-вторых, возможно, вы в конечном итоге прочитаете это значение снова?
Проблема в том, что, по-видимому, вы пишете в этот бит общего состояния по причине - чтобы сигнализировать, что что-то произошло? Вот где он падает: когда у вас нет блокирующих конструкций, нет никакого подразумеваемого порядка обращений к памяти вообще. Трудно указать на то, что здесь не так, потому что ваш пример на самом деле не содержит использование переменной, поэтому вот тривиальный пример в нейтральном C-подобном синтаксисе:
int x = 0, y = 0;
//thread A does:
x = 1;
y = 2;
if (y == 2)
print(x);
//thread B does, at the same time:
if (y == 2)
print(x);
Поток A всегда будет печатать 1, но для потока B он будет печататься полностью. Порядок операций в потоке A требуется наблюдать только из кода, выполняемого в потоке A - поток B может видеть любую комбинацию штат. Операции записи в x и y могут не выполняться по порядку.
Это может произойти даже в однопроцессорных системах, где большинство людей не ожидают такого переупорядочения - ваш компилятор может переупорядочить его для вас. В SMP, даже если компилятор не меняет порядок, записи в память могут быть переупорядочены между кэшами отдельных процессоров.
Если это не отвечает вам, включите более подробную информацию о вашем примере в вопрос. Без использования переменной невозможно окончательно сказать, является ли такое использование безопасным или нет.