Что такое семафор, мьютекс?php-102

Мьютекс

$mutex = new SyncMutex();
$mutex->lock();
// Критическая секция - только один поток имеет доступ
$mutex->unlock();
  • Определение: Примитив синхронизации, обеспечивающий эксклюзивный доступ к ресурсу
  • Особенности:
    • Только один поток может владеть мьютексом в данный момент
    • Если мьютекс занят, другие потоки блокируются
    • В PHP реализован в расширении sync (SyncMutex)
  • Использование:
    • Защита общих ресурсов (например, записи в файл)
    • Синхронизация доступа к базе данных

Семафор

$semaphore = new SyncSemaphore("resource_name", 2);
$semaphore->lock();
// Доступ ограничен 2 потоками одновременно
$semaphore->unlock();
  • Определение: Счетчик для ограничения доступа к ресурсу
  • Ключевые отличия от мьютекса:
    • Позволяет задавать лимит одновременных доступов (не только 1)
    • Может использоваться для сигнализации между процессами
    • В PHP: SyncSemaphore в расширении sync
  • Типы:
    • Двоичный семафор (аналогичен мьютексу)
    • Счетный семафор (ограничивает количество потоков)

Сравнительная таблица

Характеристика Мьютекс Семафор
Владелец Да (только один) Нет
Счетчик доступа Нет (только 1) Да (можно задавать)
Использование Защита ресурсов Ограничение доступа
В PHP SyncMutex SyncSemaphore

Практический пример

// Мьютекс для защиты записи
$dbMutex = new SyncMutex();
$dbMutex->lock();
try {
    // Операция с БД
    $pdo->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
} finally {
    $dbMutex->unlock();
}

// Семафор для ограничения соединений
$dbSemaphore = new SyncSemaphore("db_connections", 5);
$dbSemaphore->lock();
try {
    // Установка соединения
    $conn = new PDO($dsn, $user, $pass);
} finally {
    $dbSemaphore->unlock();
}

Резюмируем:

мьютекс и семафор - важные механизмы для многопоточного программирования. Мьютекс гарантирует эксклюзивный доступ, а семафор позволяет гибко ограничивать количество одновременных доступов. В PHP они реализованы в расширении sync, но для веб-приложений чаще используют блокировки на уровне БД или кеша.