美文网首页
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