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;
}

你可能感兴趣的:(GCD 中如何避免死锁和数据竞争)