使用 Barrier Task 方法
Dispatch Barrier
解决多线程并发读写同一个资源发生死锁。
Dispatch Barrier
可以确保提交的闭包在指定的队列中,在特定的时间段内得到唯一的执行。在所有先于 Dispatch Barrier
提交的任务都完成之后,这个闭包才开始执行。轮到 barrier
提交的闭包时,会执行这个闭包并且确保队列在此过程中不会执行其它任务。barrier
闭包完成后队列恢复。需要注意 dispatch_barrier_async
只在自己创建的队列上有这种作用,在全局并发队列和串行队列上,效果和 dispatch_sync
一样。
事例:高效的防止文件读写冲突
可以创建一个并行队列,操作都在这个队列中进行。没有更新数据的读用并行,而写用串行。这样既可以防止文件读写冲突,有可以提高效率。
//创建队列
_asyncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- (NSString *)someString {
__block NSString *localSomeString = nil;
dispatch_sync(_asyncQueue, ^{
localSomeString = _someString;
});
return localSomeString;
}
- (void)setSomeString:(NSString *)someString {
dispatch_barrier_async(_asyncQueue, ^{
_someString = someString;
});
}
swift示例
// 创建并行队列
self.asyncQueue = DispatchQueue.global();
var someString: NSString {
get {
// 读数据时使用并行
var localString: NSString!
self.asyncQueue.async {
localString = self.someString;
}
return localString
}
set {
// 写数据时使用串行
asyncQueue.sync(flags: .barrier, execute: {
self.someString = newValue
});
}
}