zoukankan      html  css  js  c++  java
  • 多线程下载图片,滑动tableView崩溃--资源抢夺问题

    最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.html, 当时以为是因为weakSelf和StrongSelf造成的崩溃, 然而我尽管用了StrongSelf和WeakSelf仍然崩溃,当时我也很崩溃.

    思前想后还是跟demo源码对比下吧,对比发现:

    demo代码 红框里面的代码是写在 mainQueue的block里面的, 我的是写在mainQueue上面也就是子线程中的.

    我蒙圈了,为啥呢? 我去请教大神,大神说:"因为你对字典进行插入(也叫写)操作,如果是多线程并发执行,可能会发生资源抢夺,资源抢夺会造成崩溃.对字典进行读操作不会造成资源抢夺"

    名词解释:资源抢夺 , 我的理解是多条线程操作同一个可变对象(这里是字典),

    名词解释:死锁 资源抢夺貌似跟死锁没关系

    问: 解决资源抢夺有哪些方式?

    答: a): 推荐的写法 @synchronized代码块

    1. @synchronized(self)  
    2.     {  
    3.         //关键代码;  
    4.     }

      b): NSLock同步锁. lock unLock

      c): 使用dispatch信号量

    最简单的写法是 @synchronized, 我这样写也是可以的: 在子线程对字典进行写操作,但是加锁

     下面的博客写的特别仔细

    iOS多线程开发资源抢夺和线程间的通讯问题

    http://www.cnblogs.com/huanying2000/p/6138573.html

    死锁:

    http://www.cnblogs.com/tufei7/p/6044384.html

    dispatch_sync(dispatch_get_main_queue(), ^{
            
        });

    在sync同步,阻塞主线程,会等待block执行完毕才返回,  当queue是串行队列,会造成死锁, 因为block要放在队列的队尾执行, block要最后执行, sync

    GCD中死锁的三种方式

    http://www.jianshu.com/p/f1c6e1eba5bd

  • 相关阅读:
    23. 霍纳法则(多项式求值快速算法)
    22. 欧几里德算法(求最大公约数GCD)
    [poj 2106] Boolean Expressions 递归
    [poj 1185] 炮兵阵地 状压dp 位运算
    [MOOC程序设计与算法二] 递归二
    [poj 3254] Corn Fields 状压dp
    [hdu 1074] Doing Homework 状压dp
    [hdu 1568] Fibonacci数列前4位
    [haut] 1281: 邪能炸弹 dp
    [hdu 2604] Queuing 递推 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/tufei7/p/7103132.html
Copyright © 2011-2022 走看看