В чем разница между состояниями потока (thread) terminated и suspended?

«В чем разница между состояниями потока (thread) terminated и suspended?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это два различных состояния жизненного цикла потока в iOS/macOS.

Suspended (Приостановлен)

  • Поток временно остановлен в середине выполнения.
  • Его контекст (регистры, стек) сохранен в памяти.
  • Выполнение можно возобновить с того же места методом resume().
  • Это активное состояние, потребляющее системные ресурсы.

Terminated (Завершен)

  • Поток закончил выполнение своей задачи (или был отменен).
  • Его системные ресурсы (стек, структура данных потока) освобождены.
  • Возобновление выполнения невозможно. Поток больше не существует.

Пример с Thread (не рекомендуется для приостановки):

let thread = Thread {
    print("Работа потока")
    Thread.sleep(forTimeInterval: 2)
    print("Работа завершена")
}
thread.start() // Поток запущен (running)
// thread.suspend() // ОПАСНО: Приостанавливает поток (suspended). Может привести к deadlock.
// thread.resume()  // Возобновляет выполнение (если был suspended)
thread.cancel() // Помечает поток для отмены
// После завершения блока поток переходит в состояние terminated.

⚠️ Критически важное предупреждение: Прямые вызовы suspend() и resume() класса Thread чрезвычайно опасны и не рекомендуются. Приостановка потока, удерживающего замок (lock), неминуемо приводит к взаимной блокировке (deadlock).

Современная альтернатива: Для управления задачами используйте абстракции более высокого уровня:

  • DispatchQueue (Grand Central Dispatch): Приостанавливается с помощью suspend()/resume() самой очереди, что безопаснее.
  • OperationQueue и Operation: Управление через состояния (isReady, isExecuting, isFinished) и зависимости.