Grand Central Dispatch

Grand Central Dispatch

Grand Central Dispatch (GCD), намек на название центрального вокзала в Нью-Йорке Grand Central Terminal, технология Apple предназначенная для создания приложений, использующих преимущества многоядерных процессоров и других SMP-систем[1]. Эта технология является реализацией параллелизма задач и основана на шаблоне проектирования «Пул потоков». GCD впервые была представлена в Mac OS X 10.6. Исходные коды библиотеки libdispatch, реализующей сервисы GCD, были выпущены под лицензией Apache 10 сентября 2009 г.[1]. Впоследствии библиотека была портирована[2] на другую операционную систему FreeBSD [3].

GCD позволяет определять задачи в приложении, которые могут параллельно выполняться, и запускает их при наличии свободных вычислительных ресурсов (процессорных ядер)[4].

Задача может быть определена как функция, либо как «блок».[5] Блок — это нестандартное расширение синтаксиса языков программирования C/C++/Objective-C, позволяющее инкапсулировать код и данные в один объект, аналог замыкания.[4]

Grand Central Dispatch использует потоки на низком уровне, но скрывает детали реализации от программиста. Задачи GCD легковесны, недороги в создании и переключении; Apple утверждает, что добавление задачи в очередь требует лишь 15 процессорных инструкций, в то время как создание традиционного потока обходится в несколько сотен инструкций.[4]

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

Содержание

Особенности платформы

Платформа GCD объявляет несколько типов данных и функций для создания и манипулирования ими.

  • Dispatch Queues — это объекты, поддерживающие очереди задач (анонимных блоков, либо функций), и запускающие эти задачи в порядке очереди. Библиотека автоматически создает несколько очередей с различными уровнями приоритета и выполняет несколько задач одновременно, автоматически выбирая оптимальное число задач для запуска. Пользователь библиотеки может создать любое число последовательных очередей, которые запускают задачи в порядке их добавления, по одной за раз. Поскольку последовательная очередь может выполнять только одну задачу в каждый момент времени, такие очереди можно использовать для синхронизации доступа к разделяемым ресурсам.
  • Dispatch Sources — это объекты, которые позволяют регистрировать блоки или функции для их асинхронного выполнения при срабатывании определенного события.
  • Dispatch Groups — это объекты, позволяющие объединять задачи в группы для последующего объединения (joining). Задачи могут быть добавлены в очередь как члены группы, и затем объект группы может быть использован для ожидания завершения всех задач группы.
  • Dispatch Semaphores — это объекты, которые позволяют не более, чем определенному числу задач выполняться одновременно. См. семафор.

Примеры

Два примера демонстрирующие простоту использования Grand Central Dispatch могут быть найдены в обзоре Snow Leopard Джона Сиракуза на Ars Technica.[6].

Асинхронный вызов

Изначально, у нас имеется приложение с методом analyzeDocument, осуществляющим подсчет слов и параграфов в документе. Обычно, процесс подсчета слов и параграфов достаточно быстр и может быть выполнен в главном потоке, без опасений, что пользователь заметит задержку между нажатием кнопки и получением результата:

- (IBAction)analyseDocument:(NSButton *)sender {
    NSDictionary *stats = [myDoc analyse];
    [myModel setDict:stats];
    [myStatsView setNeedsDisplay:YES];
    [stats release];
  }

Если документ очень большой, то анализ может занять достаточно много времени, чтобы пользователь заметил «подвисание» приложения. Следующий пример позволяет легко решить эту проблему:

 - (IBAction)analyzeDocument:(NSButton *)sender 
{    
 
     dispatch_async(dispatch_get_global_queue(0, 0), ^{
         NSDictionary *stats = [myDoc analyze];
         dispatch_async(dispatch_get_main_queue(), ^{
           [myModel setDict:stats];
           [myStatsView setNeedsDisplay:YES];
           [stats release];
         });
     });
}

Здесь вызов [myDoc analyze] помещен в блок, который затем помещается в одну из глобальных очередей. После того, как [myDoc analyze] завершает работу, новый блок помещается в главную очередь, который обновляет интерфейс пользователя. Проведя эти несложные изменения, программист избежал потенциального «подвисания» приложения при анализе больших документов.

Распараллеливание цикла

Второй пример демонстрирует распараллеливание цикла:

for (i = 0; i < count; i++) {
      results[i] = do_work(data, i);
}
total = summarize(results, count);

Здесь вызывается функция do_work count раз, результат ее i-го выполнения присваивается i-му элементу массива results, затем результаты суммируются. Нет оснований полагать, что do_works полагается на результаты ее предыдущих вызовов, поэтому ничто не мешает делать несколько вызовов do_works параллельно. Следующий листинг демонстрирует реализацию этой идеи с помощью GCD:

dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
     results[i] = do_work(data, i);
    });
total = summarize(results, count);

В этом примере dispatch_apply запускает count раз блок, переданный ему, помещая каждый вызов в глобальную очередь и передавая блокам числа от 0 до count-1. Это позволяет ОС выбрать оптимальное число потоков для наиболее полного использования доступных аппаратных ресурсов. dispatch_apply не возвращает управление, пока все его блоки не завершили работу, это позволяет гарантировать, что перед вызовом summarize вся работа изначального цикла выполнена.

Создание последовательных очередей

Разработчик может создать отдельную последовательную очередь для задач, которые должны выполняться последовательно, но могут работать в отдельном потоке. Новая очередь может быть создана таким образом:

dispatch_queue_t exampleQueue;
exampleQueue = dispatch_queue_create( "com.example.unique.identifier", NULL );
 
// exampleQueue может быть использована здесь.
 
dispatch_release( exampleQueue );

Избегайте помещение такой задачи в последовательную очередь, которая помещает другую задачу в ту же самую очередь. Это гарантированно приведет к взаимоблокировке (deadlock). В следующем листинге продемонстрирован случай такой взаимоблокировки:

dispatch_queue_t exampleQueue = dispatch_queue_create( "com.example.unique.identifier", NULL );
 
dispatch_sync( exampleQueue, ^{
  dispatch_sync( exampleQueue, ^{
    printf( "I am now deadlocked...\n" );
  });
});
 
dispatch_release( exampleQueue );

См. также

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Grand Central Dispatch" в других словарях:

  • Grand Central Dispatch — Maintainer Apple Inc. Entwickler Apple Inc. Aktuelle Version 1.0 (11. September 2009) Betriebssystem Mac OS X, Unix …   Deutsch Wikipedia

  • Grand Central Dispatch — Pour les articles homonymes, voir Grand Central. Grand Central Dispatch est une technologie développée par Apple pour optimiser le support des processeurs multi cœurs dans Mac OS X 10.6. Cette nouvelle architecture est conçue pour permettre aux… …   Wikipédia en Français

  • Grand Central Dispatch — Este artículo o sección necesita referencias que aparezcan en una publicación acreditada, como revistas especializadas, monografías, prensa diaria o páginas de Internet fidedignas. Puedes añadirlas así o avisar …   Wikipedia Español

  • Grand Central (technologie) — Grand Central Dispatch Pour les articles homonymes, voir Grand Central. Grand Central Dispatch est une technologie développée par Apple pour optimiser le support des processeurs multi cœurs dans Mac OS X 10.6. Cette nouvelle architecture est… …   Wikipédia en Français

  • Grand Central (homonymie) — Grand Central Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Grand Central peut désigner la Compagnie du chemin de fer du Grand Central en France, le Grand Central Creative Campus, un projet immobilier …   Wikipédia en Français

  • Grand Central — steht für: Grand Central Dispatch, eine Technologie und ein Entwicklerframework von Apple Grand Central Terminal, einen Bahnhof in Manhattan, New York Diese Seite ist eine Begriffsklärung zur Unterscheidung mehrerer m …   Deutsch Wikipedia

  • Grand Central — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Grand Central peut désigner la Compagnie du chemin de fer Grand Central de France, la Compagnie du Grand Central Belge, une ancienne compagnie ferroviaire …   Wikipédia en Français

  • Grand Central Mall — Infobox shopping mall shopping mall name = Grand Central Mall image width = caption = location = Vienna, West Virginia, USA address = coordinates = opening date = 1972 developer = Eugene Lebowitz [cite web |url=http://nl.newsbank.com/nl… …   Wikipedia

  • Grand Duke Alexei Alexandrovich of Russia — Infobox Russian Royalty|grand duke name = Alexei Alexandrovich title =Grand Duke Alexei Alexandrovich of Russia imgw = 200px caption = spouse = Alexandra Vasilievna Zhukovskaya issue = Alexei Alexandrovich imperial house =House of Holstein… …   Wikipedia

  • Grand Forks International Airport — For the airport near Grand Forks, British Columbia, Canada, see Grand Forks Airport. KGFK redirects here. For the radio station in Grand Forks, ND with the call sign KGFK, see KGFK (AM). Grand Forks International Airport IATA: GFK – …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»