Чтобы «просто добавить 1 к текущему значению», компьютер должен прочитать текущее значение, добавить 1 и записать новое значение обратно.Ясно, что порядок имеет значение;стандартный пример:
Thread A Thread B
Read: 5
Read: 5
+1 = 6
+1 = 6
Write: 6
Write: 6
Значение, начинающееся с 5, два потока выполнения добавляются по одному, и в результате получается 6 (когда должно быть 7), потому что чтение B произошло до записи A.
Но здесь есть более важное заблуждение: многие думают, что в случае гонки код будет либо читать старое значение, либо он будет читать новое значение. Это не гарантируется .Это может быть то, что происходит большую часть времени.Это может происходить постоянно на вашем компьютере с текущей версией компилятора и т. Д. Но на самом деле на самом деле возможно для кода, который обращается к данным небезопасным / быстрым способом, чтобы любой результат, даже полный мусор.Нет никакой гарантии, что значение, которое вы читаете из переменной, соответствует любому значению, которое она имела когда-либо , если вы вызвали гонку.