使用 Barrier Task 方法
Dispatch Barrier 解決多線程并發(fā)讀寫同一個資源發(fā)生死鎖。
Dispatch Barrier 可以確保提交的閉包在指定的隊列中,在特定的時間段內(nèi)得到唯一的執(zhí)行。在所有先于 Dispatch Barrier 提交的任務(wù)都完成之后,這個閉包才開始執(zhí)行。輪到 barrier 提交的閉包時,會執(zhí)行這個閉包并且確保隊列在此過程中不會執(zhí)行其它任務(wù)。barrier 閉包完成后隊列恢復(fù)。需要注意 dispatch_barrier_async 只在自己創(chuàng)建的隊列上有這種作用,在全局并發(fā)隊列和串行隊列上,效果和 dispatch_sync 一樣。
事例:高效的防止文件讀寫沖突
可以創(chuàng)建一個并行隊列,操作都在這個隊列中進(jìn)行。沒有更新數(shù)據(jù)的讀用并行,而寫用串行。這樣既可以防止文件讀寫沖突,有可以提高效率。
//創(chuàng)建隊列
_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示例
// 創(chuàng)建并行隊列
self.asyncQueue = DispatchQueue.global();
var someString: NSString {
get {
// 讀數(shù)據(jù)時使用并行
var localString: NSString!
self.asyncQueue.async {
localString = self.someString;
}
return localString
}
set {
// 寫數(shù)據(jù)時使用串行
asyncQueue.sync(flags: .barrier, execute: {
self.someString = newValue
});
}
}