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

使用 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
        });
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列...
    有梦想的老伯伯阅读 1,034评论 0 4
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,833评论 1 17
  • 尽管 Grand Central Dispatch (GCD)已经存在一段时间了,但并非每个人都知道怎么使用它。这...
    coderFamer阅读 7,448评论 1 16
  • 概念 基础 https://github.com/ChenYilong/ParseSourceCodeStudy/...
    西门吹灰阅读 166评论 0 0
  • 清朝初年,福建省新到了一位巡抚,今年的新科状元张元。没有留京任职心中不免有些许怨气,轻装简行的行至城中,打算先感受...
    小天黑阅读 517评论 0 1