【问题标题】:'OSSpinLock' was deprecated in iOS 10.0: Use os_unfair_lock() from <os/lock.h> instead'OSSpinLock' 在 iOS 10.0 中已弃用:改用 <os/lock.h> 中的 os_unfair_lock()
【发布时间】:2020-05-14 16:40:18
【问题描述】:

我经历了这个Question,但提供的解决方案不起作用。有人可以使用 os_unfair_lock() 解释任何替代方法或正确实现吗?

当我使用“OS_UNFAIR_LOCK_INIT”时,它似乎不可用。

谢谢!

【问题讨论】:

    标签: ios swift spinlock


    【解决方案1】:

    Concurrent Programming With GCD in Swift 3 中,他们警告我们不能在 Swift 中直接使用 os_unfair_lock,因为“Swift 假设任何 struct 都可以移动,而这不适用于互斥体或锁。 ”

    在该视频中,演讲者建议如果您必须使用 os_unfair_lock,请将其放入 Objective-C 类中(这不会移动 struct)。或者,如果您查看一些 stdlib code,它们表明您可以留在 Swift 中,但直接使用 UnsafeMutablePointer 而不是 struct。 (感谢 bscothern confirming this pattern。)

    因此,例如,您可以编写一个避免此问题的UnfairLock 类:

    final class UnfairLock: NSLocking {
        private let unfairLock: UnsafeMutablePointer<os_unfair_lock> = {
            let pointer = UnsafeMutablePointer<os_unfair_lock>.allocate(capacity: 1)
            pointer.initialize(to: os_unfair_lock())
            return pointer
        }()
    
        deinit {
            unfairLock.deinitialize(count: 1)
            unfairLock.deallocate()
        }
    
        func lock() {
            os_unfair_lock_lock(unfairLock)
        }
    
        func tryLock() -> Bool {
            os_unfair_lock_trylock(unfairLock)
        }
    
        func unlock() {
            os_unfair_lock_unlock(unfairLock)
        }
    }
    

    然后您可以执行以下操作:

    let lock = UnfairLock()
    

    然后像使用NSLock 一样使用lockunlock,但在幕后使用更高效的os_unfair_lock

    lock.lock()
    // critical section here
    lock.unlock()
    

    因为这符合NSLocking,您可以使用为此设计的扩展。例如,这是我们用来保证锁定和解锁平衡的常用方法:

    extension NSLocking {
        func synchronized<T>(block: () throws -> T) rethrows -> T {
            lock()
            defer { unlock() }
            return try block()
        }
    }
    

    lock.synchronized {
        // critical section here
    }
    

    但是,归根结底,不要使用 Swift 中的 os_unfair_lock 而不使用上述内容或 video 中的预期,这两者都为锁提供了稳定的内存地址。

    【讨论】:

      【解决方案2】:

      您可以使用os_unfair_lock,如下所示,

      var unfairLock = os_unfair_lock_s()
      
      os_unfair_lock_lock(&unfairLock)
      os_unfair_lock_unlock(&unfairLock)
      

      【讨论】:

      • 非常感谢,我被“OS_UNFAIR_LOCK_INIT”弄糊涂了
      • 不要像这样使用来自 Swift 的os_unfair_lock_s
      • @Rob:如果var unfairLock 是文件范围变量,那么它有一个稳定的内存地址,对吗?
      • @MartinR - 我没有看到任何正式的保证。即使是这样,它似乎也是一个我不愿依赖的实现细节。我很想更好地理解这一点。我将完全按照那个视频中的括号引用......
      • @Rob:这里forums.swift.org/t/…和这里forums.swift.org/t/kvo-context-param/4203/2提到顶级变量和静态变量都有一个稳定的地址。
      猜你喜欢
      • 2017-05-02
      • 2020-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多