Поддерживает ли блок dispatch_async последовательную очередь порядок?

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

  • dispatch_async (serial_queue, b1);
  • 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 == COUNTER всегда? Спасибо


person AnkyHe    schedule 26.06.2012    source источник


Ответы (2)


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

person Thomas Bouldin    schedule 16.10.2012
comment
Отлично, поэтому, если нам нужен FIFO, мы можем просто использовать dispatch_create_queue и установить приоритет с помощью dispatch_set_target_queue согласно этому ответу :) - person William Denniss; 24.11.2012
comment
Да, хотя я не уверен, что вам нужен dispatch_set_target_queue. Я редко вижу случай, когда разработчику правильно увеличить приоритет. - person Thomas Bouldin; 26.11.2012
comment
Я использовал его для уменьшения приоритета до самого низкого уровня. Я обрабатывал фотографии, используя очередь, созданную с помощью dispatch_create_queue, и это, похоже, помогло (пользовательский интерфейс стал более отзывчивым). - person William Denniss; 27.11.2012
comment
В этом случае вы можете рассмотреть фоновую очередь, если она доступна (4.3.0 и выше). Это гарантированно будет последовательным и будет ждать, пока активность переднего плана не установится. - person Thomas Bouldin; 03.12.2012
comment
dispatch_queue_create вместо dispatch_create_queue? - person Lubbo; 27.02.2018

в соответствии с документацией блоков ( в глобальной очереди) может выполняться одновременно

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

person Sandeep Chayapathi    schedule 03.07.2012