Middle+
Какво е livelock?
sobes.tech AI
Отговор от AI
Livelock — това е състояние, подобно на deadlock, но вместо блокиране на нишки, те постоянно се опитват да изпълнят работа, взаимно отменяйки действията си поради конкуренция за ресурси, което води до неспособност да напредват.
Пример за livelock: две нишки се опитват да получат два ресурса A и B. Нишка 1:
- Получава ресурс A.
- Опитва се да получи ресурс B. Ако не успее, освобождава A и започва отначало.
Нишка 2:
- Получава ресурс B.
- Опитва се да получи ресурс A. Ако не успее, освобождава B и започва отначало.
В резултат, нишките могат постоянно да освобождават ресурси и да се опитват да ги получат отново, без да постигнат целта.
Разлики с deadlock:
- Deadlock: нишките са блокирани, очаквайки една друга.
- 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()
// Кратка пауза, за да се избегне незабавно повторение
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)
}
}
}