'OSSpinLock' 在 iOS 10.0 中被弃用:使用 <os/lock.h> 中的 os_unfair_lock() 代替

Ren*_*dey 3 spinlock ios swift

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

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

在此处输入图片说明

谢谢!

Rob*_*Rob 6

Swift 3 中的 GCD 并发编程中,他们警告我们不能os_unfair_lock直接在 Swift 中使用,因为“Swift 假定任何东西struct都可以移动,并且不能使用互斥锁或锁。”

在该视频中,演讲者建议,如果您必须使用os_unfair_lock,请将其放在 Objective-C 类中(不会移动struct)。或者,如果您查看一些stdlib 代码,它们会显示您可以留在 Swift 中,但使用 aUnsafeMutablePointer代替struct直接。(感谢 bscothern确认此模式。)

因此,例如,您可以编写一个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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

let lock = UnfairLock()
Run Code Online (Sandbox Code Playgroud)

然后像你一样使用lockand ,但在幕后使用更有效的:unlockNSLockos_unfair_lock

lock.lock()
// critical section here
lock.unlock()
Run Code Online (Sandbox Code Playgroud)

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

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

lock.synchronized {
    // critical section here
}
Run Code Online (Sandbox Code Playgroud)

但是,最重要的是,不要os_unfair_lock在没有类似上述内容的情况下使用Swift 或该视频中的预期内容,这两者都为锁提供了稳定的内存地址。


Kam*_*ran -3

您可以os_unfair_lock按如下方式使用,

var unfairLock = os_unfair_lock_s()

os_unfair_lock_lock(&unfairLock)
os_unfair_lock_unlock(&unfairLock)
Run Code Online (Sandbox Code Playgroud)

  • 不要像这样使用 Swift 中的 `os_unfair_lock_s`。 (3认同)