【发布时间】:2020-05-14 16:40:18
【问题描述】:
我经历了这个Question,但提供的解决方案不起作用。有人可以使用 os_unfair_lock() 解释任何替代方法或正确实现吗?
当我使用“OS_UNFAIR_LOCK_INIT”时,它似乎不可用。
谢谢!
【问题讨论】:
我经历了这个Question,但提供的解决方案不起作用。有人可以使用 os_unfair_lock() 解释任何替代方法或正确实现吗?
当我使用“OS_UNFAIR_LOCK_INIT”时,它似乎不可用。
谢谢!
【问题讨论】:
在 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 一样使用lock 和unlock,但在幕后使用更高效的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 中的预期,这两者都为锁提供了稳定的内存地址。
【讨论】:
您可以使用os_unfair_lock,如下所示,
var unfairLock = os_unfair_lock_s()
os_unfair_lock_lock(&unfairLock)
os_unfair_lock_unlock(&unfairLock)
【讨论】:
os_unfair_lock_s。
var unfairLock 是文件范围变量,那么它有一个稳定的内存地址,对吗?