Проблема возникает, когда вы читаете это состояние и делаете что-то с этим.Написание - это красная селедка - это правда, что, пока это одно слово, большинство сред гарантируют, что запись будет атомарной, но это не означает, что большая часть кода, которая включает этот фрагмент, является потокобезопасной. Во-первых, предположительно, ваша глобальная переменная содержит другое значение для начала - иначе, если вы знаете, что это всегда одно и то же, почему это переменная? Во-вторых, предположительно вы в конечном итоге читаете это значение снова?
Проблема заключается в том, что, предположительно, вы пишете этот бит общего состояния по какой-либо причине - чтобы сигнализировать о том, что что-то произошло? Здесь он падает: когда у вас нет конструкций блокировки, нет никакого подразумеваемого порядка доступа к памяти вообще. Трудно указать на то, что здесь не так, потому что ваш пример фактически не содержит использования переменных, так вот trivialish примера в нейтральном 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);
Thread А всегда будет печатать 1, но полностью верно для потока B для печати 0. Порядок операций в потоке A требуется только для наблюдения из кода, выполняемого в потоке A. В потоке B разрешено видеть любую комбинацию состояния. Запись в x и y может не произойти по порядку.
Это может произойти даже на однопроцессорных системах, где большинство людей не ожидают такого рода переупорядочения - ваш компилятор может изменить его для вас. На SMP, даже если компилятор не переупорядочивает вещи, запись в память может быть переупорядочена между кешами отдельных процессоров.
Если вам кажется, что не ответит на это, включите в вопрос более подробно ваш пример. Без использования переменной невозможно однозначно сказать, является ли такое использование безопасным или нет.
Какой язык вы используете? – GateKiller 2008-09-16 13:25:55