Назад к вопросам
Middle
97
questionbank

Какие инструменты вы можете использовать для решения проблем синхронизации потоков?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • DispatchGroup: Для ожидания завершения группы асинхронных задач.
  • DispatchSemaphore: Для ограничения количества потоков, одновременно обращающихся к ресурсу.
  • NSRecursiveLock: Позволяет потоку многократно получать блокировку без возникновения взаимной блокировки.
  • NSConditionLock: Блокировка, которая может быть получена только при выполнении заданного условия.
  • OSAtomic functions: Низкоуровневые атомарные операции для простых случаев (устарели, предпочтительнее использовать атомарные свойства Swift или C++ std::atomic).
  • @synchronized: Директива Objective-C для создания критической секции.
// Пример использования DispatchSemaphore для ограничения доступа к ресурсу
import Dispatch

let semaphore = DispatchSemaphore(value: 2) // Разрешаем только 2 потока одновременно

DispatchQueue.global().async {
    semaphore.wait() // Уменьшаем счетчик, блокируемся, если 0
    print("Поток 1 работает")
    sleep(1)
    print("Поток 1 завершен")
    semaphore.signal() // Увеличиваем счетчик
}

DispatchQueue.global().async {
    semaphore.wait()
    print("Поток 2 работает")
    sleep(1)
    print("Поток 2 завершен")
    semaphore.signal()
}

DispatchQueue.global().async {
    semaphore.wait()
    print("Поток 3 работает")
    sleep(1)
    print("Поток 3 завершен")
    semaphore.signal()
}