美文网首页
GCD 中如何避免死锁和数据竞争

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

作者: Kx_ | 来源:发表于2018-03-12 21:43 被阅读0次

一、死锁条件:
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;
}

相关文章

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

    一、死锁条件:1、同步操作中使用同步调用dispatch_sync;2、使用了串行队列3、调用了方法自己4、方法中...

  • GCD总结笔记

    章节目录 什么是GCD? 如何在多条路径中执行CPU命令列? 即使多线程存在很多问题(如数据竞争、死锁、线程过多消...

  • GCD避免死锁的三要素

    平时总在用GCD,但你知不知道,GCD一不小心就会出现死锁,如果死锁在主线程上,整个程序就完了,所以避免死锁是我们...

  • 多线程Grand Central Dispatch----GCD

    最近比较清闲,写一下多线程GCD。 多线程如果使用不当,很容易引起死锁、数据竞争、因线程太多消耗过多的内存和因增加...

  • GCD日记

    更新文章:死锁 一般都是由于产生了资源竞争,而 GCD 死锁 的充分条件是: 在串行队列的任务执行过程中,再次向它...

  • Java多线程之死锁(Deadlock)及死锁避免(Deadlo

    线程死锁(Thread Deadlock) 数据库死锁(Database Deadlocks) 死锁避免 (Dea...

  • 同步串行导致的死锁问题

    GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁...

  • IOS开发 GCD产生死锁的总结

    在IOS开发中GCD的使用频率很高,但是使用不当,则会产生死锁,以下是我的对GCD产生死锁的总结。 了解死锁之前首...

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

  • MySQL死锁、资源竞争死锁

    什么是MySQL死锁: 什么是资源竞争死锁: 比如连接池 ShardingSphere文档中写到关于 数据库连接的...

网友评论

      本文标题:GCD 中如何避免死锁和数据竞争

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