为什么DISPATCH_QUEUE_CONCURRENT创建的两个并发队列不同时运行?

时间:2014-09-12 06:41:56

标签: ios multithreading concurrency grand-central-dispatch multitasking

为了同时执行两个任务,我创建了两个并发队列,并将一些块分派给两个队列。

以下是我在主线程中所做的事情

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

但是,令人惊讶的是我总是得到以下输出:

A - 1  
A - 2  
A - 3  
B - 1  
B - 2  
B - 3  

为什么这两个并发队列不能并发执行?

以下是Apple文档所说的内容(reference):

  

提交到串行队列的块按FIFO顺序一次执行一个。但是,请注意,提交给独立队列的块可以相互同时执行。提交到并发队列的块以FIFO顺序出列,但如果有资源可以同时运行。

因此,根据这个声明,在我的情况下,无论队列A中发生了什么,队列B的块都应该执行。意思是,完全独立于队列A.但是,为什么队列B的块不在#39; t开始执行,直到队列A的所有块完成。

如果某些事情被误解,请纠正我。

1 个答案:

答案 0 :(得分:6)

dispatch_sync表示"等到完成此操作后才继续"。所以你运行一个块,等待,运行另一个块,等待,等等。您必须使用dispatch_async来获得并发。

(编辑)也没有理由在这里创建第二个并发队列,一个会有相同的效果