我知道你可能会发现这是一个奇怪的问题,但我只是在学习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 1
在work task 0
之前无法启动{1}}已完成(由于串行队列保证了执行顺序),同时work task 0
无法继续执行,因为它等待SYNC dispath函数返回(请纠正我,如果我'我错了,这会让我成为一个总菜鸟。
回到最初的想法,上面的代码和相同的代码之间有什么区别,而不是调用dispatch_sync
函数我直接编写work task 1
代码?
答案 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可以进去。