Sobes.tech
Назад к вопросам
Junior — Middle
58

Какие средства синхронизации потоков использовал в своих проектах и каким образом реализовывал их?

Компании, где спрашивали
СБЕР ТехСБЕР Тех
Sector Tree

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Ожидают услышать, что есть понимание, когда нужен lock, а когда — более специализированные примитивы. Важно уметь объяснить, как избегались race condition, deadlock и лишняя блокировка потока. Хорошо, если есть опыт использования как простых, так и более осмысленных средств синхронизации в зависимости от задачи.

Определение:

Средства синхронизации потоков в C# — это механизмы, которые помогают безопасно работать с общими данными и координировать действия нескольких потоков. Они защищают критические секции, упорядочивают доступ к ресурсам и позволяют потокам ждать друг друга. Выбор зависит от сценария: для короткой защиты данных подходит lock, для сигнализации между потоками — AutoResetEvent/ManualResetEvent, для ограничения параллелизма — SemaphoreSlim, для чтения/записи — ReaderWriterLockSlim.

Пример использования:

Например, в сервисе с общим счетчиком запросов можно использовать lock, чтобы несколько потоков не увеличивали значение одновременно. Если же один поток производит данные, а другой их потребляет, удобнее использовать событийную синхронизацию или SemaphoreSlim.

private readonly object _sync = new object();
private int _counter;

public void Increment()
{
    lock (_sync)
    {
        _counter++;
    }
}

public int GetValue()
{
    lock (_sync)
    {
        return _counter;
    }
}

Пояснение кода:

Код не требуется. Пример выше показывает простейшую реализацию синхронизации через lock.

  1. Создается общий объект _sync, который используется только как монитор.
  2. При входе в lock поток получает эксклюзивный доступ к критической секции.
  3. Пока один поток выполняет Increment() или GetValue(), другие потоки ждут освобождения блока.
  4. Это предотвращает неконсистентное чтение и потерю инкрементов при одновременном доступе.

Ключевые моменты:

  • lock — базовый и самый частый вариант для защиты коротких критических секций.
  • Monitor используется под капотом lock, и его можно применять напрямую, если нужна более тонкая логика.
  • SemaphoreSlim подходит, когда нужно ограничить число одновременно работающих потоков.
  • ReaderWriterLockSlim полезен, если чтений много, а записей мало.
  • AutoResetEvent и ManualResetEvent применяются для сигнализации между потоками.
  • Важно не держать блокировку дольше необходимого и не синхронизировать все подряд, чтобы не ухудшить производительность.