2016-10-20 5 views
0

я узнал немного о GCD барьерах и хотели изучить эту информацию (от Apple docs):Новые задачи не ждут GCD барьеры

Любых блоков, представленных после барьерного блока не не выполняются до тех пор, барьерный блок завершается.

К этому коду:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
for (int i = 0; i < 500, i++) { 
    dispatch_async(queue, ^{ 
    NSLog("%d", i); 
    } 
    if ((i % 50) == 0) { 
    dispatch_barrier_async(queue, ^{ 
     for (int j = 0; j < 5; j++) { 
     [NSThread sleepForTimeInterval:1]; 
     NSLog(@"Barrier!"); 
     } 
    }); 
    } 
} 

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

+2

Что произойдет, если вы создаете свою очередь с помощью: 'очереди = dispatch_queue_create ("SomeName", DISPATCH_QUEUE_CONCURRENT);' ? – rmaddy

ответ

2

Кажется, вы неправильно поняли следующий пункт в документации

Очередь указать, должна быть параллельной очереди, которые вы создаете самостоятельно, используя функцию dispatch_queue_create. Если в очередь вы передаете , это последовательная очередь или одна из глобальных очередей , эта функция ведет себя как функция dispatch_async .

т.е.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 

не будет выступать в качестве барьера, но вместо нормального dispatch_async