iOS-SwiftiOS DeveloperiOS 小册

GCD 之多线程并发读写(Barrier Task)

2016-12-01  本文已影响499人  fuyoufang

使用 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
        });
    }
}
上一篇下一篇

猜你喜欢

热点阅读