Сегодня я столкнулся с этим вопросом:
у вас есть код
static int counter = 0;
void worker() {
for (int i = 1; i <= 10; i++)
counter++;
}
Если worker
будет вызываться из двух разных потоков, какое значение будет counter
после завершения обоих из них?
Я знаю, что на самом деле это может быть что угодно. Но мои внутренние мужества говорят мне, что counter++
скорее всего будет переведен в одну инструкцию ассемблера, и если оба потока выполняются на одном ядре, counter
будет равен 20.
Но что, если эти потоки выполняются на разных ядрах или процессорах, может ли быть состояние гонки в их микрокоде? Можно ли рассматривать одну инструкцию ассемблера как атомную операцию?