GCDシリアルキュー、同時キューとホームキューの整理
4116 ワード
1.シリアルキュー:Dispatch QuesまたはSerial Ques
同期
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);
dispatch_sync(queue, ^(void) {
sleep(2-i/50);
NSLog(@"The sum is: %d", i);
//flag = YES;
});
dispatch_release(queue);
非同期
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);
dispatch_async(queue, ^(void) {
sleep(2-i/50);
NSLog(@"The sum is: %d", i);
// signal the semaphore
//dispatch_semaphore_signal(sem);
});
dispatch_release(queue);
プライマリ・スレッドが信号量を待機している場合、オペレーティング・システムは直接それを停止するので、フラグ・ポーリングを死にすることなく、CPUリソースを他のスケジューリング可能なスレッドにタイムリーに使用することができます.
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);
dispatch_async(queue, ^(void) {
sleep(2-i/50);
NSLog(@"The sum is: %d", i);
// signal the semaphore
dispatch_semaphore_signal(sem);
});
// wait for the semaphore
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(queue);
2.同時キュー
:Concurrent Queues
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
3.メインチーム列:main dispatch Queue
dispatch_queue_t mainQueue = dispatch_get_main_queue();
以上の3つのキューについて:concurrent queues
とmain queue
システムによって生成されdispatch_suspend, dispatch_resume, dispatch_set_context
これらの関数は無効です.
しかし、私たちのアプリケーションは簡単な同期ではなく、非同期で実行され、アプリケーションは常に混合されています.
例えばtask 1 task 2 task 3をすべて実行してからtask 4 task 5 task 6を非同期で実行するにはどうすればいいですか?ここでgroupの概念を導入することができます.
-(void)sixthMethod{
// concurrent queue
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 1 queue group
dispatch_group_t queueGroup = dispatch_group_create();
// 1
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"task 1.");
});
// 2
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"task 2.");
});
// 3
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"task 3.");
});
NSLog(@"wait task 1,2,3.");
//
dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
NSLog(@"task 1,2,3 finished.");
//
dispatch_release(queueGroup);
//
queueGroup = dispatch_group_create();
// 4
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"task 4.");
});
// 5
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"task 5.");
});
// 6
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"task 6.");
});
NSLog(@"wait task 4,5,6.");
//
dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
NSLog(@"task 4,5,6 finished.");
//
dispatch_release(queueGroup);
}
コード実行結果:
2013-05-13 13:55:33.783 GDC[2466:1303] task 1.
2013-05-13 13:55:33.783 GDC[2466:3a07] task 3.
2013-05-13 13:55:33.783 GDC[2466:c07] wait task 1,2,3.
2013-05-13 13:55:33.783 GDC[2466:1903] task 2.
2013-05-13 13:55:33.787 GDC[2466:c07] task 1,2,3 finished.
2013-05-13 13:55:33.788 GDC[2466:c07] wait task 4,5,6.
2013-05-13 13:55:33.788 GDC[2466:1303] task 4.
2013-05-13 13:55:33.788 GDC[2466:1903] task 5.
2013-05-13 13:55:33.788 GDC[2466:3a07] task 6.
2013-05-13 13:55:33.790 GDC[2466:c07] task 4,5,6 finished.