2011-07-29 10 views
27

Aşağıdaki kod: 2 ve düşük açtığında, 1, yüksek yüksek karışımı içindedispatch_get_global_queue davranış

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i=0; i<100000; i++) { 
     NSLog(@"HIGH 1 %d", i); 
    } 
}); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    for (int i=0; i<100000; i++) { 
     NSLog(@"LOW %d", i); 
    } 
}); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i=0; i<100000; i++) { 
     NSLog(@"HIGH 2 %d", i); 
    } 
}); 

sonuçlanır.

Aynı anda yüksek1 ve yüksek2 günlüklerini yazdırır. aynı sıradaki high1 ve high2 blogları değil mi? Yüksek2 bloğu yürütmeye başlamadan önce high1 bloğu bitmemeli?

cevap

22

Bu, çalıştığınız makineye göre değişir. Bunu Mac'inizde çalıştırdığınızdan şüpheleniyorum, çünkü GCD otomatik olarak global kuyruklardaki işler için belirli bir sistem için yeterince iş parçacığı oluşturacaktır. Yani, muhtemelen birden fazla çekirdeğe sahip olursunuz, bu yüzden GCD, işlerinizi her iki çekirdekte de çalıştırıyor.

Sıranızı dispatch_queue_create kullanarak oluşturursanız, bir seri sıra alırsınız ve daha sonra FIFO davranışını garanti altına alırsınız.

FWIW (bu davranışa güvenmemeniz gerekmesine rağmen), bunu iPhone'da çalıştırırsanız, iPhone'unuz tek çekirdekli olduğundan seri sıra davranışını gördüğünüzden şüpheleniyorum. Buna güvenmeyin, iPad 2 bence çok çekirdekli!

DÜZENLEME: dispatch_get_global_queue için

Dokümantasyon: belirli bir öncelik düzeyi iyi bilinen küresel eşzamanlı kuyruğunu döndürür .

6

Sadece neden dispatch_async içinde iş parçacığı için güvenli olmayan yöntemleri çağırmamalısınız. Daha fazla iş yürütmek için yeterli işlem çekirdeği varsa, GCD, belirli bir sıradaki önceki işlerin henüz dönüp dönmediğine bakılmaksızın devam eder. Kötü erişim hataları veya benzeri konusunda endişe duymadan ancak ilgili endişeleriniz varsa

Açıkçası NSLog()
dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT); 

olarak istediğiniz sıklıkta çağrılabilir: aynı davranış ile kendi sıraları oluşturarak OS X 10.7 elde edilebilir iş parçacığı güvenliği veya işinizin geri dönüş sırasındaki siparişleri gönderim grupları kullanarak düşünün.

0

dispatch_get_global_queue, eşzamanlılık sırasının bir türüdür. High1 ve high2 için aynı önceliği belirttiğinizde, sonuç high1 ve high2'nin karışımıdır. Bundan sonra, daha düşük bir önceliğe sahip olduğu için düşük sonuç olacaktır.