Sobes.tech
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(); // Освобождаване на мютекса (само собственикът може)