在当前队列上同步分派

我知道你可能会发现这是一个奇怪的问题,但我只是学习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完成之前不能启动(因为保证执行顺序的串行队列) ,同时work task 0不能继续执行,因为它等待SYNC dispath函数返回(如果我错了,请纠正我,这将使我总是noob)。

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

不,我想不出有什么理由在你已经在同一个队列上dispatch_sync 。 如果你这样做,GCD将立即在同一个线程上直接调用你的块,就像直接调用它一样。 (我检查了。)正如你所指出的那样,在串行队列上这样做会使你陷入僵局。

假设所有例子都是这个队列:

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可以进去。