在当前队列上同步调度

时间:2013-10-04 11:59:14

标签: ios multithreading concurrency grand-central-dispatch

我知道你可能会发现这是一个奇怪的问题,但我只是在学习GCD,我想完全理解它的所有方面。所以这就是:

是否有理由在CURRENT QUEUE上分配任务SYNC?

例如:

    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(...);
    dispatch_async(concurrentQueue, ^{
       //this is work task 0

       //first do something here, then suddenly:

       dispatch_sync(concurrentQueue, ^{
               //work task 1
       });

       //continue work task 0
    });

我理解一件事:如果我使用串行队列代替concurrentQueue,那么我会在该串行队列上遇到死锁,因为work task 1work task 0之前无法启动{1}}已完成(由于串行队列保证了执行顺序),同时work task 0无法继续执行,因为它等待SYNC dispath函数返回(请纠正我,如果我'我错了,这会让我成为一个总菜鸟。

回到最初的想法,上面的代码和相同的代码之间有什么区别,而不是调用dispatch_sync函数我直接编写work task 1代码?

2 个答案:

答案 0 :(得分:7)

没有。我想不出你曾经在同一个并发队列上dispatch_sync的原因。如果你这样做,GCD将立即在同一个线程上直接调用你的块,就像你直接调用它一样。 (我查了一下。)正如你所指出的,在串行队列上执行此操作会使你陷入僵局。

答案 1 :(得分:3)

为所有示例假设此队列:

dispatch_queue_t queue = dispatch_queue_create(“com.somecompany.queue”,nil);

情况1 - 确定

dispatch_async(queue, ^{
    [self goDoSomethingLongAndInvolved];
    dispatch_async(queue, ^{
        NSLog(@"Situation 1");
    });
});

情况2 - 不行!死锁!

dispatch_sync(queue, ^{
    [self goDoSomethingLongAndInvolved];
    dispatch_sync(queue, ^{
        NSLog(@"Situation 2”); // NOT REACHED!  DEADLOCK!
    });
});

情况3 - 不行!死锁!

dispatch_async(queue, ^{
    [self goDoSomethingLongAndInvolved];
    dispatch_sync(queue, ^{
        NSLog(@"Situation 3"); // NOT REACHED!  DEADLOCK!
    });
});

情况4 - 确定

dispatch_sync(queue, ^{
    [self goDoSomethingLongAndInvolved];
    dispatch_async(queue, ^{
        NSLog(@"Situation 4");
    });
});

基本上dispatch_sync不喜欢在里面。

只有dispatch_asyncs可以进去。