首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GCD同步Swift 3中的属性

使用GCD同步Swift 3中的属性
EN

Stack Overflow用户
提问于 2016-07-14 11:45:26
回答 2查看 5.5K关注 0票数 15

我看了今年的WWDC GCD的谈话,我认为有一个代码片段是有问题的。它是关于使用DispatchQueues.使属性线程安全。

代码语言:javascript
复制
class MyObject {
    private var internalState: Int
    private let internalQueue: DispatchQueue // Serial or Concurrent?

    var state: Int {
        get {
            return internalQueue.sync { internalState }
        }

        set (newState) {
            internalQueue.sync { internalState = newState }
        }
    }
}

他们使用DispatchQueue锁定属性。但是我认为这个片段是无效的,因为internalQueue可能是并发的。因此,如果我们从两个不同的DispatchQueues/Threads调用setter (如果内部队列不是串行的),也会导致线程问题,对吗?因为在我的理解中,同步只是保存调用线程,并且在任务完成时继续。你觉得这个片段怎么样?我说错了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-14 11:55:16

但是我认为这个片段无效,因为internalQueue可能是并发的。

但这不是同时发生的。默认情况下,您创建的调度队列是串行的。这就是技术的要点(和例子)。

票数 13
EN

Stack Overflow用户

发布于 2017-02-13 13:02:56

我只想展示另一种方法,它使您能够并发地阅读,但是在使用分派屏障编写时阻塞所有内容。

代码语言:javascript
复制
class MyObject {
private var internalState: Int
private let internalQueue = DispatchQueue(label: "reader-writer", attributes: .concurrent)

var state: Int {
    get {
        return internalQueue.sync { internalState }
    }

    set (newState) {
        internalQueue.async(flags: .barrier) { internalState = newState }
    }
  }
}

使用这种方法,可以在队列上并发进行读取,但是由于屏障,写入是独占执行的。

这只是一个Swift 3转换的方法解释在书中有效目标C2.0,由马特加洛韦编写。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38373338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档