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

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完成.

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

Cat*_*Man 6

dispatch_sync表示"在继续之前等待,直到完成".所以你运行一个块,等待,运行另一个块,等待,等等.您必须使用dispatch_async来获得并发性.

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

  • 并发队列上的dispatch_sync实际上没有任何效果,因此假装它不存在. (2认同)
  • 但是,dispatch_async的行为肯定会有所不同.如果将dispatch_async分配给串行队列,它将与调用者并发,但这些块不会彼此同时运行.如果将dispatch_async分派到并发队列,则这些块将同时运行. (2认同)
  • 最好的做法是使用nsurlsession,真的.并行处理的问题非常复杂,它可以为您处理. (2认同)