美文网首页iOS
多线程死锁

多线程死锁

作者: 说不出口的喵 | 来源:发表于2018-08-20 01:02 被阅读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(@"这个也不会死锁");

    });

    相关文章

      网友评论

        本文标题:多线程死锁

        本文链接:https://www.haomeiwen.com/subject/cyahiftx.html