Sobes.tech
Back to questions
Junior — Middle
68

Какие последствия возникнут, если вызвать метод Sync у Concurrent очереди в многопоточной среде?

Companies where asked
iviivi

Answer from AI

sobes.tech AI

Вызов метода sync (например, dispatch_sync) на конкурентной очереди в многопоточной среде может привести к взаимной блокировке (deadlock), если этот вызов происходит из той же очереди.

Почему?

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

Для конкурентных очередей это менее критично, чем для последовательных, так как конкурентная очередь может выполнять несколько задач одновременно. Однако, если dispatch_sync вызывается из задачи, которая уже выполняется на этой же конкурентной очереди, и очередь ограничена по количеству потоков, возможна блокировка.

Резюме:

  • Вызов dispatch_sync на конкурентной очереди из другого потока обычно безопасен.
  • Вызов dispatch_sync на той же очереди, где уже выполняется код, может привести к deadlock.

Пример:

let queue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)

queue.async {
    print("Start")
    // Опасный вызов, если очередь ограничена и блокирует текущий поток
    queue.sync {
        print("Inner sync")
    }
    print("End")
}

В этом примере возможна блокировка, если очередь не может выполнить вложенную задачу, пока текущая не завершится.