2011-12-25 1 views
3

Это связано с API Grand Central Dispatch используется в Objective-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); 

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

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

ответ

5

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

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

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

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

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

+2

«Это единственная очередь, задачи которой * гарантированы * выполняются в главном потоке программы». Dispatch_sync() из основного потока в другую очередь часто выполняется без создания другого потока выполнения, то есть на главной нить. –

+0

Спасибо за исправление, Эшли. –

+0

@OleBegemann, если программа работает на iPhone с одним ядром. Будет ли окончательная связь между количеством потоков и количеством очередей? –