Skip to content

Latest commit

 

History

History
executable file
·
86 lines (60 loc) · 6.32 KB

File metadata and controls

executable file
·
86 lines (60 loc) · 6.32 KB

Многопоточность (Multitherading)

К оглавлению

Структура раздела

Описание

Многопоточность позволяет распределять задачи по потокам и одновременно (или последовательно) выполнять их.

Основные понятия

  • Thread (поток) - последовательность инструкций, которая может быть выполнена независимо от отслального кода программы.
  • Queue (очередь) - множество выполняемых задач, абстракция, используемая Apple в GCD и Operation, позволяющая не опускаться на уровень потоков.
  • Task (задача) - набор инструкций (функция или замыкание), которые выполняются в рамках определенной очереди на некотором потоке.

Типы многопоточности

  • Parallelism - Выполнение нескольких задач в одно и то же время на нескольких процессорных ядрах.
  • Concurrency - выполнение нескольких задач в одно время на одном процессорном ядре с помощью Context switching

Типы очередей (при работе с Grand Central Dispatch)

  • Serial - Текущий поток прекращает встает в режим ожидания до тех пор, пока не будет заверш другой поток.
  • Concurrent - Текущий поток продолжает выполнение паралельно с другим потоком.

Quality of Service, QoS - типы приоритетов потоков

Для каждого потока может быть определен приоритет

  • background - самый низкий, когда время выполнения задачи не имеет значения. Например синхронизация или индексация.
  • utility - для слежубных операций, требующих значительного времени для выполнения. Например, импорт или обработка большого количества данных.
  • default - средний приоритет, используется по-умолчанию.
  • userInitiated - высокий приоритет, используется для задачи инициированных пользователем, если он ожидает их немедленного выполнения. Например загрузка полноразмерного изображения при нажатии на превью.
  • userInteractive - самый высокий приоритет. используется для обновления/перемещения элементов интерфейса.

Интерфейсы многопоточности в iOS

О них нужно знать

  • pthread - низкоуровневая работа с потоками с помощью синтаксиса С
  • Thread class - первый уровень абстракции над pthreads
  • ??? NSObject - имеет ряд методов, использующих класс Thread

Их нужно использовать

GCD и Operation тянутся из Objective-C. Первая самостоятельная реализация многопоточности в Swift - это async/await & Actors

Отличия GCD и Operations

  • 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