Почему две параллельные очереди, созданные DISPATCH_QUEUE_CONCURRENT, не работают одновременно?

Чтобы выполнить две задачи одновременно, я сделал две параллельные очереди и отправил некоторые блоки в обе очереди.

Вот что я делаю в основной теме

-(IBAction)btn_Pressed:(id)sender
{
    dispatch_queue_t queue_a = dispatch_queue_create("com.gcd_demoA", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue_b = dispatch_queue_create("com.gcd_demoB", DISPATCH_QUEUE_CONCURRENT);

    dispatch_sync(queue_a, ^{
        NSLog(@"A - 1");
    });

     dispatch_sync(queue_a, ^{
        NSLog(@"A - 2");
    });

    dispatch_sync(queue_a, ^{
        NSLog(@"A - 3");
    });

    dispatch_sync(queue_b, ^{
        NSLog(@"B - 1");
    });

    dispatch_sync(queue_b, ^{
        NSLog(@"B - 2");
    });

    dispatch_sync(queue_b, ^{
        NSLog(@"B - 3");
    });
}

Но, на удивление, я всегда получаю следующий результат:

A - 1  
A - 2  
A - 3  
B - 1  
B - 2  
B - 3  

Почему эти две параллельные очереди не выполняются одновременно?

Вот что говорит Apple (ссылка):

Блоки, отправленные в последовательную очередь, выполняются по очереди в порядке FIFO. Однако обратите внимание, что блоки, отправленные в независимые очереди, могут выполняться одновременно друг с другом. Блоки, отправленные в параллельную очередь, удаляются в порядке FIFO, но могут выполняться одновременно, если для этого доступны ресурсы.

Итак, в соответствии с этим утверждением, в моем случае, блоки очереди B должны выполняться независимо от того, что происходит в очереди A. Средство, полностью независимое от очереди A. Но почему блоки очереди B не запускают свое исполнение до тех пор, пока все блоки очереди A заканчиваются.

Поправьте меня, если что-то было неправильно понято.

+1
источник поделиться
1 ответ

dispatch_sync означает "подождите, пока это не будет выполнено до продолжения". Таким образом, вы запускаете один блок, ждите, запускаете другой блок, подождите и так далее. Вы должны использовать dispatch_async для получения параллелизма.

(edit) также нет причин создавать вторую параллельную очередь здесь, один будет иметь тот же эффект

+6
источник

Посмотрите другие вопросы по меткам или Задайте вопрос