Что происходит внутри, когда dispatch_apply вызывается в dispatch_sync из той же параллельной очереди - PullRequest
2 голосов
/ 19 октября 2011

Пример:

dispatch_sync(someConcurrentQueue, ^(){
    dispatch_apply(5,someConcurrentQueue, ^(size_t i){
        // do some non-thread safe operation
     });
});

Я решил проверить это и заметил, что безопасная операция не выполнялась как ожидалось. Однако когда я вызвал dispatch_sync с использованием глобальной очереди, все быстро ухудшилось.

Итак, мои вопросы: 1. Что происходит под капотом с таким звонком? 2. Планируется ли каждая итерация dispatch_apply с предварительным планированием в своем собственном потоке, а затем выполняется последовательно? 3. Если ответ на вопрос 2 «да», будет ли увеличение производительности внутри бесконечного цикла? Причина в том, что операция может начать выполняться, как только завершится последняя, ​​вместо повторения цикла.

1 Ответ

2 голосов
/ 22 октября 2011

Это примерно то же самое, что и:

dispatch_sync(someConcurrentQueue, ^(){
    for (size_t i = 0; i < 5; ++i){
        dispatch_async(someConcurrentQueue, ^(){
            // do some non-thread safe operation
        });
    }
});

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

  • sync
  • async (0)
  • async (1)
  • async (2)
  • async (3)
  • async (4)
  • синхронизация
  • ...

Поскольку ваши следующие dispatch_sync будут выполнены после того, как dispatch_apply было запланировано (не выполнено), ваша очередь очень быстро увеличится в размере.

...