GCD 中如何避免死锁和数据竞争

一、死锁条件:
1、同步操作中使用同步调用dispatch_sync;
2、使用了串行队列
3、调用了方法自己
4、方法中使用了dispatch_barrier_sync
概括:一般死锁都是在同步操作中使用了同步调用,同步调用需要当前任务完成之后才能继续执行,当前任务需要同步调用执行才算执行,导致死循环,这样就会导致死锁。需要注意使用的队列是串行队列还是并行队列

二、避免死锁
尽量使用dispatch_async和并行队列来执行代码,具体情况具体分析

三、数据竞争条件
同一时刻不同的线程都在对某一个数据源进行读或者写操作

四、避免数据竞争
1、最简单的做法,全部代码都适用同步操作,这样代码只能执行完这一段才能到下一段,这样不会导致数据竞争,但是效率低下。
2、dispatch_barrier_async,类似于依赖,会等待之前的操作完全之后才会进行新的操作,这样也不会导致数据竞争

- (void)setIdentifier:(NSString *)identifier{
    dispatch_barrier_async(_concurrentQueue, ^{
        _identifier = [identifier copy];
    });
}

- (NSString *)identifier{
    __block NSString *tmpIdentifier;
    dispatch_sync(_concurrentQueue, ^{
        tmpIdentifier = _identifier;
    });
    return tmpIdentifier;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS中GCD的使用小结 作者dullgrass 2015.11.20 09:41*字数 4996阅读 20199...
    DanDanC阅读 872评论 0 0
  • GCD笔记 总结一下多线程部分,最强大的无疑是GCD,那么先从这一块部分讲起. Dispatch Queue的种类...
    jins_1990阅读 783评论 0 1
  • 你最美的样子是抱起一个个隐藏的日出是拉下一幕幕遮羞的面罩倾世温柔
    空即墨阅读 222评论 0 0
  • 成长有两条路,一条是用心走的,叫梦想,一条是用脚走的,叫现实,两者结合在一起,叫目标。目标让你知道生命的价值...
    Stan森阅读 436评论 0 0
  • 经理女儿过生日,叫我们一起庆祝, 我也是许久未见这位千金了,真是名副其实的美女,我们都忍不住多欣赏一会,...
    般若秋雪阅读 297评论 0 1