Middle
Каква е разликата между семафор и мютекс?
sobes.tech AI
Отговор от AI
Мютекс (Mutex, Mutual Exclusion) — механизъм за синхронизация, който гарантира, че в даден момент време само един поток има достъп до критичната секция на кода или ресурс. Той работи по принципа на собственост: потокът, който блокира мютекса, трябва да го освободи.
Семафор (Semaphore) — по-общ механизъм за синхронизация, който управлява достъпа до ресурс, ограничен с определен брой "разрешения". Потоците могат да получат разрешение, ако е налично, и да продължат изпълнението. Когато ресурсът вече не е нужен, разрешението се връща. Семафорът няма концепция за собственост; всеки поток може да увеличи брояча на семафора.
Ключови разлики:
- Назначение: Мютексът се използва за изключителен достъп (един поток), семафор — за управление на достъпа до ограничен пул от ресурси (няколко потока до лимита).
- Собственост: Мютексът има собственик (потокът, който го е блокирал). Семафорът няма собственик.
- Брояч: Мютексът може да се разглежда като семафор с брояч, равен на 1. Семафорът може да има брояч по-голям от 1.
- Операции: Мютекс:
WaitOne/Pulse/ReleaseMutex. Семафор:WaitOne/Release.
Ето прост пример за използване на семафор в C#:
// Създаваме семафор с начална стойност 2 и максимум 2.
// Позволява на 2 потока да имат достъп до ресурса едновременно.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// Потокът се опитва да получи достъп до ресурса
semaphore.WaitOne();
// ... работа с ресурса ...
semaphore.Release(); // Освобождаване на разрешението
Пример за мютекс:
// Създаваме мютекс
Mutex mutex = new Mutex();
// Потокът се опитва да получи изключителен достъп
mutex.WaitOne();
// ... работа с критичната секция ...
mutex.ReleaseMutex(); // Освобождаване на мютекса (само собственикът може)