NSP*_*tik 1 concurrency multithreading multitasking grand-central-dispatch ios
为了同时执行两个任务,我创建了两个并发队列,并将一些块分派给两个队列.
这是我在主线程中所做的
-(IBAction)btn_Pressed:(id)sender
{
dispatch_queue_t queue_a = dispatch_queue_create("com.gcd_demoA", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue_b = dispatch_queue_create("com.gcd_demoB", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue_a, ^{
NSLog(@"A - 1");
});
dispatch_sync(queue_a, ^{
NSLog(@"A - 2");
});
dispatch_sync(queue_a, ^{
NSLog(@"A - 3");
});
dispatch_sync(queue_b, ^{
NSLog(@"B - 1");
});
dispatch_sync(queue_b, ^{
NSLog(@"B - 2");
});
dispatch_sync(queue_b, ^{
NSLog(@"B - 3");
});
}
Run Code Online (Sandbox Code Playgroud)
但是,令人惊讶的是我总是得到以下输出:
A - 1
A - 2
A - 3
B - 1
B - 2
B - 3
Run Code Online (Sandbox Code Playgroud)
这是Apple文档所说的(参考):
提交到串行队列的块按FIFO顺序一次执行一个.但是,请注意,提交给独立队列的块可以相互同时执行.提交到并发队列的块以FIFO顺序出列,但如果有资源可以同时运行.
所以,根据这个语句,在我的情况下,无论队列A中发生了什么,队列B的块都应该执行.意思是,完全独立于队列A.但是,为什么队列B的块不会开始执行直到所有队列A完成.
如果某些事情被误解,请纠正我.
dispatch_sync表示"在继续之前等待,直到完成".所以你运行一个块,等待,运行另一个块,等待,等等.您必须使用dispatch_async来获得并发性.
(编辑)也没有理由在这里创建第二个并发队列,一个会产生相同的效果