Как работают очереди и потоки? - PullRequest
3 голосов
/ 25 декабря 2011

Это относится к Grand Central Dispatch API, используемому в target-c, со следующими кодами:

dispatch_queue_t downloadQueue = dispatch_queue_create("other queue", NULL);
dispatch_async(downloadQueue, ^{
    ....some functions that retrieves data from server...
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"got it");
    });
});
dispatch_release(downloadQueue);

В настоящее время мое понимание того, как работают очереди, состоит в том, что блоки в очереди перейдут впоток для этой очереди.Таким образом, две очереди станут двумя потоками.При многопоточности эти две очереди будут происходить одновременно.Тем не менее, «получил» появляется прямо в тот момент, когда программа получила данные.Как это случилось?

Пожалуйста, укажите, хотите ли вы исправить или дополнить мое понимание потоков и очереди.

1 Ответ

5 голосов
/ 25 декабря 2011

Таким образом, две очереди станут двумя потоками.

Не обязательно. Одним из преимуществ GCD является то, что система динамически решает, сколько потоков она создает, в зависимости от количества доступных ядер ЦП и других факторов. Вполне возможно, что две пользовательских очереди выполняются в одном фоновом потоке, особенно если для обеих очередей редко ожидают выполнения задачи.

Единственное, в чем вы можете быть уверены, это то, что последовательная очередь никогда не использует более одного потока одновременно. Таким образом, задачи, которые вы добавляете в одну (последовательную) очередь, всегда будут выполняться по порядку. Это не относится к трем параллельным глобальным очередям, которые вы получаете с dispatch_get_global_queue().

Кроме того, основная очередь (та, к которой вы обращаетесь с помощью dispatch_get_main_queue()) всегда связана с основным потоком. Это единственная очередь, задачи которой выполняются в главном потоке программы.

В вашем примере задача для downloadQueue выполняется в фоновом потоке. Как только код достигает значения dispatch_async(dispatch_get_main_queue(), ^{, GCD передает эту новую задачу главному потоку, где она выполняется практически сразу, при условии, что основной поток не занят другими вещами.

...