Коллекция вопросов ❓ на собеседовании в C# 🍧

Обзор вопросов по языка програмиированию C# и технологии NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

⏳ Какие бывают примитивы синхронизации в .NET?

Typing SVG

Static Badge

✨ Оглавление

⬆ Вернуться к главной


1️⃣ Основная идея


2️⃣ lock (Monitor)

private readonly object _lock = new object();

lock(_lock)
{
    // критическая секция
}

3️⃣ Mutex (System.Threading.Mutex)

Mutex mutex = new Mutex();
mutex.WaitOne(); // захват
try
{
    // критическая секция
}
finally
{
    mutex.ReleaseMutex();
}

4️⃣ Semaphore и SemaphoreSlim

Semaphore

Semaphore sem = new Semaphore(2, 5); // максимум 2 потока одновременно
sem.WaitOne();
// критическая секция
sem.Release();

SemaphoreSlim


5️⃣ AutoResetEvent и ManualResetEvent

AutoResetEvent are = new AutoResetEvent(false);

Thread t = new Thread(() =>
{
    Console.WriteLine("Waiting...");
    are.WaitOne(); // ждёт сигнала
    Console.WriteLine("Signaled!");
});

t.Start();
Thread.Sleep(1000);
are.Set(); // отправка сигнала

6️⃣ Monitor.Wait() / Monitor.Pulse() / PulseAll()

lock(_lock)
{
    while(!condition) Monitor.Wait(_lock);
    // обработка
    Monitor.Pulse(_lock);
}

7️⃣ ReaderWriterLockSlim

ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

// Чтение
rwLock.EnterReadLock();
try { /* чтение */ } finally { rwLock.ExitReadLock(); }

// Запись
rwLock.EnterWriteLock();
try { /* запись */ } finally { rwLock.ExitWriteLock(); }

8️⃣ Interlocked


9️⃣ Каверзные моменты и подводные камни

  1. lock vs Monitor

    • lock — синтаксический сахар для Monitor.Enter/Exit.
    • Нужно никогда не блокировать на публичных объектах (возможны deadlock/внешние вмешательства).
  2. Mutex vs Semaphore

    • Mutex → дорого, межпроцессный.
    • SemaphoreSlim → лёгкий, для одного процесса.
  3. Deadlock

    • Два потока ждут друг друга → взаимная блокировка.
    • Часто при nested lock / комбинировании нескольких примитивов.
  4. Async / await

    • Для асинхронных методов:

      • SemaphoreSlim.WaitAsync()
      • AsyncLock (от сторонних библиотек)
    • lock не совместим с await внутри, нужен AsyncLock.

  5. Производительность

    • Interlocked быстрее всех.
    • lock медленнее, но проще и безопаснее.
    • Mutex самый дорогой.

🔟 Таблица примитивов

Примитив Scope Особенности Поддержка async
lock / Monitor Один процесс Рекурсивный, блокирует поток Нет
Mutex Межпроцессный Можно именовать, дорогой Нет
Semaphore Один/Межпроцессный Ограничение N потоков Нет
SemaphoreSlim Один процесс Лёгкий, поддержка async Да
AutoResetEvent Один процесс Сигнал одному потоку Нет
ManualResetEvent Один процесс Сигнал всем потокам Нет
ReaderWriterLockSlim Один процесс Много читателей, один писатель Нет
Interlocked Один процесс Атомарные операции с числами Да (частично)

⬆ Вернуться к главной

✨Dvurechensky✨