使用 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
});
}
}