Если два потока одновременно прибавляют значение к общей переменной без использования примитивов синхронизации (например, lock, mutex), возникает состояние гонки (race condition). Это значит, что операции чтения и записи могут пересекаться, приводя к некорректным результатам.
Что произойдёт, если два потока одновременно прибавляют значения к переменной без примитивов синхронизации? Какие могут быть результаты?
Если два потока одновременно прибавляют значение к общей переменной без использования примитивов синхронизации (например, lock, mutex), возникает состояние гонки (race condition).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что произойдёт, если два потока одновременно прибавляют значения к переменной без примитивов синхронизации? Какие могут быть результаты?
Ответ
Если два потока одновременно прибавляют значение к общей переменной без использования примитивов синхронизации (например, lock, mutex), возникает состояние гонки (race condition). Это значит, что операции чтения и записи могут пересекаться, приводя к некорректным результатам.
Например, если переменная равна 0, и два потока одновременно делают x = x + 1, то оба могут прочитать 0, прибавить 1 и записать 1, хотя правильный итог должен быть 2.
Результаты могут быть:
- Потеря обновлений (increment не учитывается).
- Непредсказуемое значение переменной.
Чтобы избежать этого, нужно использовать синхронизацию, например:
int x = 0;
object locker = new object();
void Increment() {
lock(locker) {
x = x + 1;
}
}
Или использовать атомарные операции из System.Threading.Interlocked.