Многопоточность позволяет распределять задачи по потокам и одновременно (или последовательно) выполнять их.
- Thread (поток) - последовательность инструкций, которая может быть выполнена независимо от отслального кода программы.
- Queue (очередь) - множество выполняемых задач, абстракция, используемая Apple в GCD и Operation, позволяющая не опускаться на уровень потоков.
- Task (задача) - набор инструкций (функция или замыкание), которые выполняются в рамках определенной очереди на некотором потоке.
- Parallelism - Выполнение нескольких задач в одно и то же время на нескольких процессорных ядрах.
- Concurrency - выполнение нескольких задач в одно время на одном процессорном ядре с помощью Context switching
- Serial - Текущий поток прекращает встает в режим ожидания до тех пор, пока не будет заверш другой поток.
- Concurrent - Текущий поток продолжает выполнение паралельно с другим потоком.
Для каждого потока может быть определен приоритет
- background - самый низкий, когда время выполнения задачи не имеет значения. Например синхронизация или индексация.
- utility - для слежубных операций, требующих значительного времени для выполнения. Например, импорт или обработка большого количества данных.
- default - средний приоритет, используется по-умолчанию.
- userInitiated - высокий приоритет, используется для задачи инициированных пользователем, если он ожидает их немедленного выполнения. Например загрузка полноразмерного изображения при нажатии на превью.
- userInteractive - самый высокий приоритет. используется для обновления/перемещения элементов интерфейса.
- pthread - низкоуровневая работа с потоками с помощью синтаксиса С
- Thread class - первый уровень абстракции над pthreads
- ??? NSObject - имеет ряд методов, использующих класс Thread
- Grand Central Dispatch
- Operation
- Async/await & Actors (доступно в iOS 15+)
GCD и Operation тянутся из Objective-C. Первая самостоятельная реализация многопоточности в Swift - это async/await & Actors
- Operations могут отменять задачи прямо в процессе исполнения, в то время как GCD может отменить выполнение задачи только до того, как она будет начата.
Используется для обеспечения защиты объектов от некорретных изменений, возникающих из-за одновременного доступа сразу с нескольких потоков.
- Mutex
- pthread_mutex_t - мьютексы для pthread_t
- NSLock - блокировки (без условий)
- NSConditionLock
- NSDestributedLock
- Условие
- Semaphore (Семофор)
- Барьер (Barrier)
- Другие
- pthread_rwlock_t - read-write lock, защита данных независимо для чтения и записи (реализации в Foundation нет,используем С-шные типы)
- unfair lock - что был виден, нужно импортировать Darwin, например через Foundation или UIKit. Данный тип блокировки хранит информацию о потоке-владельце, на основе которой ОС пытается в случае необходимости разрешить инверсию приоритетов.
- objc_sync
- spin lock - deprecated in iOS 10, заменен на unfair lock