Самые часто задаваемые вопросы на собеседовании по C#
23. Как обеспечить взаимоисключающий доступ к общим ресурсам в многопоточной системе в C# без использования lock или Monitor?
Вы можете использовать другие примитивы синхронизации. Некоторые распространенные альтернативы:
1) Мьютекс: гарантирует, что только один поток может одновременно получить доступ к общему ресурсу. В отличие от lock, мьютекс – примитив ОС и может обеспечивать межпроцессную синхронизацию. Пример:
var mutex = new Mutex();2) Семафор: ограничивает количество одновременных потоков, которые могут получить доступ к общему ресурсу. Пример:
//...
mutex.WaitOne();
try
{
// Доступ к общему ресурсу
}
finally
{
mutex.ReleaseMutex();
}
var sem = new Semaphore(1, 1);3) ReaderWriterLockSlim: обеспечивает эффективный доступ для чтения и записи к общим ресурсам. Позволяет выполнять несколько одновременных операций чтения, когда ни один писатель не удерживает блокировку на запись. Пример:
// Начальное и максимальное количество
// потоков установлено в 1
//...
sem.WaitOne();
try
{
// Доступ к общему ресурсу
}
finally
{
sem.Release();
}
var rwLock = new ReaderWriterLockSlim();4) SpinLock: пытается получить блокировку до тех пор, пока не будет достигнут успех. SpinLock следует использовать в сценариях с низким уровнем конфликтов, когда ожидается, что блокировка будет удерживаться в течение очень короткого времени. Пример:
//...
// Чтение
rwLock.EnterReadLock();
try
{
// Доступ к общему ресурсу
}
finally
{
rwLock.ExitReadLock();
}
//...
// Запись
rwLock.EnterWriteLock();
try
{
// Доступ к общему ресурсу
}
finally
{
rwLock.ExitWriteLock();
}
var spinLock = new SpinLock();Помните, что эти примитивы синхронизации имеют более высокие накладные расходы чем обычный lock.
bool lockTaken = false;
//...
spinLock.Enter(ref lockTaken);
try
{
// Доступ к общему ресурсу
}
finally
{
if (lockTaken)
{
spinLock.Exit();
}
}
UPD: спасибо подписчикам, напомнили про прекрасный доклад о примитивах синхронизации от Станислава Сидристого.
Источник: https://dev.to/bytehide/c-multithreading-interview-questions-and-answers-4opj