Строки двух задач могут перемешиваться. Внутри каждой задачи индексы идут от 0 до 99, а sync блокирует вызывающий поток до окончания только Task 2.
Определите, какой вывод получит программа №34
Строки двух задач могут перемешиваться. Внутри каждой задачи индексы идут от 0 до 99, а sync блокирует вызывающий поток до окончания только Task 2.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этом Swift‑примерe создаётся конкурентная очередь и в неё помещаются две задачи: первая запускается асинхронно, вторая – синхронно. Нужно предсказать, какие строки будут напечатаны и в каком порядке.
import Foundation
let workQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
workQueue.async {
for index in 0..<100 {
print("Task 1 - \(index)")
}
}
workQueue.sync {
for index in 0..<100 {
print("Task 2 - \(index)")
}
}
Ответ
Строки двух задач могут перемешиваться. Внутри каждой задачи индексы идут от 0 до 99, а sync блокирует вызывающий поток до окончания только Task 2.
Concurrent queue допускает одновременное выполнение блоков, поэтому async перед sync не означает, что Task 1 обязательно полностью закончится первой. Каждая задача сохраняет собственный порядок печати. После возврата из workQueue.sync Task 1 ещё может работать; для ожидания обеих нужен отдельный механизм завершения. В короткой консольной программе также надо обеспечить, чтобы процесс не завершился раньше оставшейся async-работы. Одна точная общая последовательность условием не гарантируется.