GCD有关问题:dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"Hello ?");}); 死锁的原因

这里先分清两个概念:Queue 和 Async、Sync。

Queue(队列):队列分为串行和并行。串行队列上面你按照A、B、C、D的顺序添加四个任务,这四个任务按顺序执行,结束顺序也肯定是A、B、C、D。而并行队列上面这四个任务同时执行,完成的顺序是随机的,每次都可能不一样。

Async VS Sync(异步执行和同步执行):使用dispatch_async 调用一个block,这个block会被放到指定的queue队尾等待执行,至于这个block是并行还是串行执行只和dispatch_async参数里面指定的queue是并行和串行有关。但是dispatch_async会马上返回。

使用dispatch_sync 同样也是把block放到指定的queue上面执行,但是会等待这个block执行完毕才会返回,阻塞当前queue直到sync函数返回。

所以队列是串行、并行 和 同步、异步执行调用block是两个完全不一样的概念。这两个概念清楚了之后就知道为什么死锁了。

分析上面的原因:

在主线程中通过Sync方式把block加入到主线程队列,那么当前线程(主线程)就会被阻塞,等待block执行完毕后回调,而blcok被加入了主线程队列中,主线程队列又是一个串行队列,那么block的执行就需要等待主线程执行完前面的任务后才能被执行,这样的相互等待状态产生了死锁,block永远没有机会执行。

如果执行上面语句的线程不是主线程则不会造成死锁,如下图:

GCD有关问题:dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@

你可能感兴趣的:(GCD有关问题:dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"Hello ?");}); 死锁的原因)