Sobes.tech
Back to questions
Middle+
150
questionbank

Что такое livelock?

Sobes Copilot

Get answers in real time

Answer from AI

sobes.tech AI

Livelock — это состояние, аналогичное dead-lock, но вместо блокировки потоки постоянно пытаются выполнить работу, отменяя действия друг друга из-за конкуренции за ресурсы, что приводит к их неспособности продвинуться вперед.

Пример livelock: два потока пытаются взять два ресурса A и B. Поток 1:

  1. Получает ресурс A.
  2. Пытается получить ресурс B. Если не удается, освобождает A и начинает заново.

Поток 2:

  1. Получает ресурс B.
  2. Пытается получить ресурс A. Если не удается, освобождает B и начинает заново.

В результате потоки могут постоянно освобождать ресурсы и пытаться получить их снова, не достигая цели.

Различия с dead-lock:

  • Dead-lock: потоки заблокированы, ожидая друг друга.
  • Livelock: потоки активно работают, но не прогрессируют.

Предотвращение:

  • Упорядоченный доступ к ресурсам.
  • Тайм-ауты при попытке получения ресурса.
  • Избегание сложных зависимостей между ресурсами.

Пример псевдокода с попыткой livelock:

// Ресурс 1
let resource1 = NSLock()
// Ресурс 2
let resource2 = NSLock()

// Поток 1
DispatchQueue.global().async {
    while true {
        resource1.lock()
        if resource2.tryLock() {
            // Успешно получили оба ресурса
            // Выполняем работу
            print("Поток 1 выполняет работу")
            resource2.unlock()
            resource1.unlock()
            break // Завершаем цикл после успешного получения
        } else {
            // Не удалось получить resource2, отпускаем resource1 и пробуем снова
            resource1.unlock()
            // Небольшая задержка, чтобы избежать немедленной повторной попытки,
            // но это не гарантирует предотвращение livelock
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}

// Поток 2
DispatchQueue.global().async {
    while true {
        resource2.lock()
        if resource1.tryLock() {
            // Успешно получили оба ресурса
            // Выполняем работу
            print("Поток 2 выполняет работу")
            resource1.unlock()
            resource2.unlock()
            break // Завершаем цикл после успешного получения
        } else {
            // Не удалось получить resource1, отпускаем resource2 и пробуем снова
            resource2.unlock()
            // Небольшая задержка
            Thread.sleep(forTimeInterval: 0.01)
        }
    }
}