Я читал о протоколе MESI и не могу понять, почему возникает гонка за данные, если у нас есть монопольный доступ к каждой операции записи, что, следовательно, делает недействительными строки кеша в кешах других ядер? в этом примере:
CYCLE # CORE 1 CORE 2
0 reg = load(&counter);
1 reg = reg + 1; reg = load(&counter);
2 store(&counter, reg); reg = reg + 1;
3 store(&counter, reg);
сказано, что общий результат состоит в том, что переменная увеличивается только один раз, в то время как оба ядра пытаются увеличить ее (ожидается, что результат будет равен двум). Таким образом, возникает вопрос, если во время операции записи оба ядра запрашивают монопольный доступ к строке кэша (и, таким образом, другие ядра «ждут» своей очереди на изменение и, таким образом, получают также монопольный доступ), почему существует гонка данных по этой переменной?