TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2497 2.75K
День 2066. #ЗаметкиНаПолях
Использование Mutex<T> для Синхронизации Доступа к Общему Ресурсу
Когда вам нужно получить доступ к общему ресурсу, вы можете использовать оператор lock или примитив синхронизации, такой как System.Threading.Mutex, для синхронизации доступа.

Однако в сложном коде его легко забыть:
var obj = new object();
var value = 42;
lock (obj)
{
// Надо убедиться, что lock используется везде, где происходит доступ к ресурсу
Console.WriteLine(value);
}

// ⚠️ Здесь доступ получен без блокировки
value = 43;


Можно сделать это более явным и менее подверженным ошибкам, создав класс Mutex<T>, который инкапсулирует общий ресурс и примитив синхронизации:
var m = new Mutex<int>(42);
using (var scope = m.Acquire())
{
// доступ к ресурсу
Console.WriteLine(scope.Value);

// изменение ресурса
scope.Value = 43;
}
// ✔️ Вы не можете использовать общий ресурс вне области мьютекса

Вот реализация класса Mutex<T> и его области MutexScope<T>:
sealed class Mutex<T>
{
internal T _value;
private readonly Lock _lock = new();

public Mutex() { _value = default!; }
public Mutex(T initialValue)
=> _value = initialValue;

public MutexScope<T> Acquire()
{
_lock.Enter();
return new MutexScope<T>(this);
}

internal void Release()
=> _lock.Exit();
}

sealed class MutexScope<T>
: IDisposable
{
private readonly Mutex<T> mutex;
private bool disposed;

internal MutexScope(Mutex<T> mutex)
{
this.mutex = mutex;
}

public ref T Value
{
get
{
ObjectDisposedException
.ThrowIf(disposed, this);
return ref mutex._value!;
}
}

public void Dispose()
{
mutex.Release();
disposed = true;
}
}


Источник: https://www.meziantou.net/using-mutex-t-to-synchronize-access-to-a-shared-resource.htm
  • 👍 28
  • 👎 2
More from @netdeveloperdiary
  1. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  2. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  3. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  4. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 3, 2026Post #3360
  6. Oct 3, 2026День 2803. #Оффтоп Чем Заняться, Пока Работают Агенты? У VS Code Есть Ответ Сейчас большую…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →