美文网首页
GCD子线程异步阻塞的坑

GCD子线程异步阻塞的坑

作者: 繁华乱世沧桑了谁的容颜 | 来源:发表于2020-07-03 15:44 被阅读0次

什么?异步并发的子线程也会阻塞其他线程?

哈哈异步子线程是不会阻塞主线程的,但是有可能会影响其他线程 这个是比较坑的地方 比如你开了线程异步后 发现除主线程外都不执行了 什么原因?
请看下面例子

首先创建一个线程

- (dispatch_queue_t)saveInfoQue
{
    if (!_saveInfoQue)
    {
      _saveInfoQue = dispatch_queue_create("com.saveInf.que", DISPATCH_QUEUE_CONCURRENT);
    }
    return _saveInfoQue;
}

例子1: 场景比如做一下耗时操作 比如写入数据库 需要查询 删除写入操作 这时候你封装方法保存用了dispatch_async 但是当你使用这句代码的时候 可能是一个数组for循环保存 这时候效果就类似于下面的效果

for (int i = 0; i < 5000; i ++)
  {
    dispatch_async(self.saveInfoQue, ^{
        [NSThread sleepForTimeInterval:2];
    });
  }

这个时候如果你的界面有请求网络的操作 你会发现网络不再请求了 这时候下意识的以为是AF线程被阻塞了, 这时候你查看线程会发现 com.saveInf.que这个线程已经被创建了上百个 超过了CPU支持的最大数量 , 那么你另外的AF请求就没办法执行了 因为CPU不能开启更多的线程 导致网络请求创建一直处于等待状态,其效果类似于阻塞。

这个时候我们应该怎么办呢?

使用下面这个方法就可以避免线程过多而导致的类似于阻塞现象

dispatch_async(self.saveInfoQue, ^{
    
    for (int i = 0; i < 5000; i ++)
      {
        [NSThread sleepForTimeInterval:2];
      }
});

这个问题告诉我们不是所有的方法都要封装 还是要根据实际情况来定 不过这种情况比较少见!!!

相关文章

网友评论

      本文标题:GCD子线程异步阻塞的坑

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