Организация очередей на низком уровне средствами GCD
Система управляет очередями сама, автоматически выполняя единицы работы во многих потоках. Это избавляет нас от необходимости запускать фоновые потоки, управлять ими непосредственно и вести учет используемых системных ресурсов, т.е. решать задачи, которые обычно связаны с реализацией параллельных приложений, поскольку система берет на себя решение всех этих задач.
Упомянутый выше принцип постановки единиц работы в очередь на выполнение в фоновом режиме, когда система управляет потоками автоматически, оказывается довольно эффективным и значительно упрощает многие ситуации, возникающие в процессе разработки, когда требуется параллелизм. Всю необходимую для этого инфраструктуру предоставляет диспетчер Grand Central Dispatch, впервые появившийся в версии 10.6 операционной системы Mac OS X. Он вошел также в состав версии 4.0 системы iOS. Данная технология пригодна для программирования не только на Objective-C, но и на С и C++.
Самые главные принципы многопоточной обработки, в том числе единицы работы, безболезненная фоновая обработка, автоматическое управление потоками, реализованы в диспетчере GCD в виде интерфейса С, которым можно пользоваться на всех языках программирования, созданных на основе языка С. Более того, компания Apple реализовала диспетчер GCD с открытым исходным кодом, который может быть перенесен на другие платформы типа Unix.
К числу основных принципов, по которым работает диспетчер GCD, относится очередь. Система предоставляет ряд предварительно заданных очередей, в том числе и очередь, для которой выполнение операций всегда гарантируется в основном потоке. Это идеально подходит для каркаса UIKit, который не является потокобезопасным! Имеется также возможность организовывать собственные очереди в каком угодно количестве. Очереди диспетчера GCD действуют строго по принципу "первым вошел, первым вышел" (FIFO). Единицы работы, добавляемые в очередь, всегда запускаются на выполнение в том порядке, в каком они поставлены в очередь. Таким образом, их выполнение не всегда может завершаться в том же самом порядке, поскольку работа в очереди GCD будет автоматически распределяться по как можно большему числу потоков.
Для каждой очереди доступен пул потоков, многократно используемый в течение срока действия приложения. Диспетчер GCD будет всегда пытаться поддерживать пул потоков, наиболее подходящий для архитектуры конкретной машины, автоматически используя преимущества многоядерного процессора более производительной машины для выполнения имеющейся работы. Все современные мобильные устройства, работающие под управлением системы iOS, имеют одноядерные процессоры, поэтому данный вопрос пока не актуален, но он непременно встанет, когда появятся более производительные мобильные устройства, работающие под Ю5.
- Дата: 1-01-2015, 15:21