我对这段代码的行为有些怀疑:
dispatch_async(queue, ^{
sleep(2);
NSLog(@"step1");
dispatch_sync(queue, ^{
sleep(3);
NSLog(@"step 2");
});
NSLog(@"step 3");
});
我希望从这些行中获得输出 step1 -> step3 -> step2
但我只获得了 step1
。
如果我将 dispatch_sync 更改为 dispatch_async 它会按预期工作,dispatch_sync 进入 dispatch_async 调用是否会产生此类问题?
回答后编辑----------------
这种情况会造成死锁:
您可以查看已接受的答案以获得对这种情况的解释,并查看此链接以获取文档 http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html
最佳答案
这是一个僵局。
dispatch_sync
调用将等待 queue
可用,然后运行其 block 并返回,但直到 dispatch_async
才可用已经完成,所以它会坐在那里旋转等待调用 dispatch_sync
。
关于objective-c - dispatch_sync 调用变成 dispatch_async 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668585/