2011-07-29 8 views
27

次のコードdispatch_get_global_queue挙動

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); 
    } 
}); 

高い1の混合物をもたらし、高い2及びローログ。

high1とhigh2のログを同時にどのように出力するのですか?同じキューのhigh1とhigh2の両方のブログではありませんか? high2ブロックを実行する前にhigh1ブロックを終了しないでください。

答えて

22

これは、実行しているマシンによって異なります。 GCDは自動的にグローバルキュー上のジョブのための特定のシステムのための十分なスレッドを作成するので、私はあなたのMacでこれを実行していると思う。したがって、おそらく複数のコアがあるので、GCDは両方のコアでジョブを実行しています。

dispatch_queue_createを使用してキューを作成すると、シリアルキューが作成され、FIFOの動作が保証されます。

FWIW(この動作に頼るべきではありませんが)iPhoneで実行すると、あなたのiPhoneはシングルコアなので、シリアルキューの動作が表示されると思われます。しかし、これに頼らないで、iPad 2は私が考えるマルチコアです!

EDIT:dispatch_get_global_queueため

ドキュメント:優先度のよく知られているグローバル同時キューを返し 。

6

あなたはdispatch_asyncの中でスレッドセーフではないメソッドを呼び出さないでください。より多くのジョブを実行するのに十分な処理コアがある場合、GCDは先行ジョブがまだ返っていないかどうかに関わらず処理を進めます。悪いアクセスエラーまたは類似を得ることを心配することなく、しかし、あなたが心配ならば

明らか NSLog()
dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT); 

はできるだけ頻繁にあなたが好きなように呼び出すことができます。同じ動作をして、独自のキューを作成することによって、OS X 10.7で達成することができますスレッド安全性、またはジョブがディスパッチ・グループを使用して戻す順序を考慮する必要があります。

0

dispatch_get_global_queueは、並行性キューの一種です。high1とhigh2に同じ優先度を指定すると、結果はhigh1とhigh2の混合です。その後、低い優先順位を持つため、低い結果になります。