2012-06-26 60 views
3

當我提交兩個塊成串行隊列由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始終?感謝

回答

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

我用它來降低最低級別的優先級。我正在使用用'dispatch_create_queue'創建的隊列處理照片,並且它似乎有所幫助(UI更具響應性)。 –