iOS

多线程死锁

2018-08-20  本文已影响35人  说不出口的喵

异步执行block肯定不会发生死锁

事实上,导致死锁的原因一定是:

在某一个串行队列中,同步的向这个队列添加block。

同步的向串行队列中添加

另外,因为队列是可以嵌套的,比如在A队列(串行)添加一个任务a,在a这个任务中向B队列(串行)添加任务b,在b这个任务中又向A队列添加任务,这就间接满足了“在某一个串行队列中,同步的向这个队列添加block”。但是我们好像每一次都没有直接向相同的队列中添加block。

所以:判断是否发生死锁的最好方法就是看有没有在串行队列(当然也包括主队列)中向这个队列添加任务

我们使用同步的方法编程,往往是要求保证任务之间的执行顺序是完全确定的。且不说GCD提供了很多强大的功能来满足这个需求,向串行队列中同步的添加任务本身就是不合理的,毕竟队列已经是串行的了,直接异步添加就可以了。

dispatch_sync(dispatch_get_main_queue(), ^(void){

NSLog(@"这里死锁了"); 

 });

dispatch_async(dispatch_get_global_queue(0,0), ^(void){

NSLog(@"这就不死锁了");

});

dispatch_queue_t queue = dispatch_queue_create("SimaSDK", nil);

dispatch_sync(queue, ^(void){

NSLog(@"这个也不会死锁");

});

上一篇下一篇

猜你喜欢

热点阅读