美文网首页
GCD 死锁

GCD 死锁

作者: 其字德安 | 来源:发表于2018-01-18 11:54 被阅读2次

    死锁

    • 什么是死锁?

      • 在当前队列中, 追加一个任务; 如果使用同步函数, 则在当前线程中执行源代码, 与等待执行追加的block任务产生冲突, 造成死锁
    • sample code

        dispatch_queue_t queue = dispatch_get_main_queue()
        
        // 该步, 造成死锁
        dispatch_sync(queue, ^{
            // block1
            NSLog(@"do something");
        });
        
        // 原因`dispatch_sync`阻塞当前线程, 等待追加的block1执行完;才会往下执行
        
        // 但是当前线程中, 又在执行源代码; 即把block1追加到queue队列中;
        
        // 故两者卡死;
      
       dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
        
        dispatch_async(queue, ^{
            NSLog(@"%@", [NSThread currentThread]);
            // 该步, 造成死锁
            dispatch_sync(queue, ^{
                
                NSLog(@"do something");
            });
        });
        // 原因`dispatch_sync`阻塞当前线程
        // 当前线程在执行追加block到队列源代码, 且block又在当前线程执行
      
          dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
        
        dispatch_async(queue, ^{
       
          // <NSThread: 0x608000263000>{number = 3, name = (null)}
            NSLog(@"%@", [NSThread currentThread]);
            
            dispatch_queue_t queue2 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
            
            dispatch_sync(queue2, ^{
                
                // <NSThread: 0x608000263000>{number = 3, name = (null)}
                NSLog(@"%@", [NSThread currentThread]);
                
                NSLog(@"do something");
            });
            
            NSLog(@"sss");
        });
        
      // 上面是同一线程, 且是同步函数但没有死锁;
      // 原因是, 任务执行的队列不一样
      
    • 故造成死锁的两个条件

      • 使用同步函数
      • 执行的多个任务队列同一队列

    相关文章

      网友评论

          本文标题:GCD 死锁

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