GCD 中如何避免死锁和数据竞争
2018-03-12 本文已影响0人
Kx_
一、死锁条件:
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;
}