2012-06-26 4 views
3

Когда я отправить два блока в последовательной очереди на dispatch_async, это обеспечить второй работает после первого:
Отправляет ли блок dispatch_async в последовательную очередь?

  • dispatch_async (serial_queue, б1);
  • dispatch_async (serial_queue, b2);

можем ли мы гарантировать, что b1 работает до b2?

Ниже полный исходный код раздела:



    #define COUNTER 10000 
     m_value = 0; 
     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
     dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL); 
     dispatch_group_t group = dispatch_group_create(); 
     for (int i = 0; i < COUNTER; ++i) { 
     dispatch_group_async(group, globalQueue, ^() { 
      dispatch_async(queue, ^() { 
      ++m_value; 
      }); 
     }); 
     } 
     dispatch_group_notify(group, queue, ^() { 
     NSLog(@"m_value Actual: %d Expected: %d", m_value, COUNTER); 
     }); 

     dispatch_release(queue); 
     dispatch_release(group); 
     queue = nil; 
     group = nil; 
     return YES; 

Можем ли мы гарантировать m_value == СЧЕТЧИК всегда? Благодаря

ответ

0

Согласовывающ documentation блоки (на глобальной очереди) могут быть выполнены одновременно

«Блоки, представленные на этих глобальных одновременных очередей могут быть выполнены одновременно по отношению друг к другу.»

3

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

+0

Ужасно, поэтому, если мы хотим FIFO, мы можем просто использовать 'dispatch_create_queue' и установить приоритет с помощью' dispatch_set_target_queue' [в соответствии с этим ответом] (http://stackoverflow.com/a/9965389/72176) :) –

+0

Да, хотя я не уверен, что вам нужно dispatch_set_target_queue. Я редко вижу случай, когда разработчик имеет право * увеличить * приоритет. –

+0

Я использовал его для _decrease_ приоритета до самого низкого уровня. Я обрабатывал фотографии, используя очередь, созданную с помощью 'dispatch_create_queue', и, похоже, она помогала (пользовательский интерфейс был более отзывчивым). –

Смежные вопросы